我想检查CGContext中单个像素的颜色。我试过在这里使用这个指南http://www.markj.net/iphone-uiimage-pixel-color/。然而,我试过了,没有成功。我不想从图像中获取context因为我已经有了一个在屏幕上不可见的context。是否有可能在CGContext中找到单个像素颜色,如果可能的话,我该如何做到这一点?谷歌没有给我答复。下面你可以看到我是如何声明我的上下文的。
- (BOOL) initContext:(CGSize)size {
float scaleFactor = [[UIScreen mainScreen] scale];
// scaleFactor = 1; non-retina
// scalefactor = 2; retina
int bitmapByteCount;
int bitmapBytesPerRow;
// Declare the number of bytes per row. Each pixel in the bitmap in this
// example is represented by 4 bytes; 8 bits each of red, green, blue, and
// alpha.
bitmapBytesPerRow = (size.width * 4);
bitmapByteCount = (bitmapBytesPerRow * size.height)*scaleFactor*scaleFactor;
// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
cacheBitmap = malloc( bitmapByteCount );
if (cacheBitmap == NULL){
return NO;
}
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrderDefault;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
cacheContext = CGBitmapContextCreate (cacheBitmap, size.width*scaleFactor, size.height *scaleFactor, 8, bitmapBytesPerRow*scaleFactor, colorSpace, bitmapInfo);
CGContextScaleCTM(cacheContext, scaleFactor, scaleFactor);
CGColorSpaceRelease(colorSpace);
CGContextSetRGBFillColor(cacheContext, 0, 0, 0, 0.0);
CGContextFillRect(cacheContext, (CGRect){CGPointZero, CGSizeMake(size.height*scaleFactor, size.width*scaleFactor)});
return YES;
}
基本上我想要一个方法,我可以输入一个点,并从cacheContext获取颜色。
如果cacheBitmap
是指向像素的指针,那么可以使用以下方法找到(x,y)处的像素:
uint8_t* pixel = (uint8_t*)cacheBitmap + (y * bitmapRowBytes) + (x * 4);
uint8_t alpha = pixel [ 0 ];
uint8_t red = pixel [ 1 ];
uint8_t green = pixel [ 2 ];
uint8_t blue = pixel [ 3 ];
但是,您的bitmapBytesPerRow
计算不正确。如果您通过height * scaleFactor
分配width * scaleFactor
位图,那么您的bitmapRowBytes
需要考虑到这一点。应该是:
bitmapRowBytes = size.width * 4 * scaleFactor;