从 UIImage 读取像素会导致 BAD_ACCESS

Posted

技术标签:

【中文标题】从 UIImage 读取像素会导致 BAD_ACCESS【英文标题】:Reading pixels from UIImage results in BAD_ACCESS 【发布时间】:2016-12-19 11:00:00 【问题描述】:

我编写了这段代码,它应该在继续之前对所有非白色像素进行 NSLog 测试。

这是我的代码:

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];。可能是什么问题?

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

【问题讨论】:

我运行了上面的 sn-p 并且使用 75 × 35 像素的图像没有给我任何错误。我在 View 中添加了代码确实加载了。 我的图像要大得多,但这应该不是问题:( 【参考方案1】:

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

【讨论】:

缓冲区的大小取自 CFDataGetBytePtr 这是正确的字节数。

以上是关于从 UIImage 读取像素会导致 BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

UIImage裁剪透明像素

对 UIImage 进行像素化会返回具有不同大小的 UIImage

从 RGBA 像素字节数据重构 UIImage 的问题

MonoTouch 从 CIImage 创建 UIImage 会导致参数无效/选择器错误

UIImage 将原始像素从白色更改为清晰?

Re: 快速从 UIImage/CGImage 获取像素数据作为数组