/** * Creates the selection channel from a gray scale image. * black = unselected */ bool CxImage::SelectionSet(CxImage &from) { if (!from.IsGrayScale() || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight){ strcpy(info.szLastError,"CxImage::SelectionSet: wrong width or height, or image is not gray scale"); return false; } if (pSelection==NULL) pSelection = (uint8_t*)malloc(head.biWidth * head.biHeight); uint8_t* src = from.info.pImage; uint8_t* dst = pSelection; if (src==NULL || dst==NULL){ strcpy(info.szLastError,"CxImage::SelectionSet: null pointer"); return false; } for (int32_t y=0; y<head.biHeight; y++){ memcpy(dst,src,head.biWidth); dst += head.biWidth; src += from.info.dwEffWidth; } SelectionRebuildBox(); return true; }
/** * Inverts the selection. * Note: the SelectionBox is set to "full image", call SelectionGetBox before (if necessary) */ bool CxImage::SelectionInvert() { if (pSelection) { uint8_t *iSrc=pSelection; int32_t n=head.biHeight*head.biWidth; for(int32_t i=0; i < n; i++){ *iSrc=(uint8_t)~(*(iSrc)); iSrc++; } SelectionRebuildBox(); return true; } return false; }
/** * Inverts the selection. * Note: the SelectionBox is set to "full image", call SelectionGetBox before (if necessary) */ bool CxImage::SelectionInvert() { if (pSelection) { BYTE *iSrc=pSelection; long n=head.biHeight*head.biWidth; for(long i=0; i < n; i++){ *iSrc=(BYTE)~(*(iSrc)); iSrc++; } SelectionRebuildBox(); return true; } return false; }