我如何在CGContext中检查单个像素的颜色



我想检查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;

最新更新