从UIImage读取像素会导致BAD_ACCESS

时间:2016-12-19 11:00:00

标签: ios objective-c uiimage

我编写了这段代码,该代码应该在进一步开始之前将所有非白色像素作为测试进行测试。

这是我的代码:

UIImage *image = [UIImage imageNamed:@"image"];
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
if(!pixelData) {
    return;
}

const UInt8 *buffer = CFDataGetBytePtr(pixelData);
CFRelease(pixelData);

for(int y = 0; y < image.size.height; y++) {
    for(int x = 0; x < image.size.width; x++) {
        int pixelInfo = ((image.size.width  * y) + x) * 4;

        UInt8 red = buffer[pixelInfo];
        UInt8 green = buffer[(pixelInfo + 1)];
        UInt8 blue = buffer[pixelInfo + 2];
        UInt8 alpha = buffer[pixelInfo + 3];

        if(red != 0xff && green != 0xff && blue != 0xff){
            NSLog(@"R: %hhu, G: %hhu, B: %hhu, A: %hhu", red, green, blue, alpha);
        }
    }
}

出于某种原因,当我构建一个应用程序时,它会迭代片刻,然后在行上抛出BAD_ACCESS错误: UInt8 red = buffer[pixelInfo];。可能是什么问题?

这是迭代像素的最​​快方法吗?

1 个答案:

答案 0 :(得分:0)

我认为问题是缓冲区大小错误。 buffer 的大小为宽x高, pixelInfo 的乘数为4。 我认为你需要创建一个大4倍的数组,并在这个新数组中保存缓冲区的每个像素颜色。但是你必须要小心,不要阅读更多的缓冲区大小。