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

时间:2014-05-03 15:07:27

标签: ios objective-c core-graphics

我想检查CGContext中单个像素的颜色。我在此尝试使用本指南http://www.markj.net/iphone-uiimage-pixel-color/。但是我尝试过没有成功。我不想从图像中获取上下文,因为我已经有了一个在屏幕上看不到的上下文。是否有可能在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中获取颜色。

1 个答案:

答案 0 :(得分:0)

如果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计算错误。如果您按width * scaleFactor分配height * scaleFactor位图,那么您的bitmapRowBytes需要考虑到这一点。它应该是:

bitmapRowBytes = size.width * 4 * scaleFactor;