2

我想从 uiimage 获取数据以读取 rgb 值。我想将此数据用于卷积过滤器。在互联网上,我发现只有一种方法:

// First get the image into your data buffer
CGImageRef image = [UIImage CGImage];
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData_ = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel_ * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent,           bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height));
CGContextRelease(context);

// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
red = rawData[byteIndex];
green = rawData[byteIndex + 1];
blue = rawData[byteIndex + 2];
alpha = rawData[byteIndex + 3];

没关系,但我想处理数组上的像素,如下所示:[x][y][r,b,g]。

我该如何解决?

4

2 回答 2

1

还有另一种获取图像数据的方法:技术问答 QA1509:从 CGImage 对象获取像素数据

至于如何访问它,您没有太多选择。多维 C 数组只有在第二维和后续维具有在编译时已知的固定大小时才能工作。图像数据没有。

于 2012-05-16T07:14:21.963 回答
0

作为替代建议,我建议不要在 CPU 上进行图像卷积。相反,我的GPUImage框架中有各种基于 GPU 的卷积,这些卷积可以比 CPU 密集型实现快一个数量级。

其中包括经过高度优化的 GPUImageSobelEdgeDetectionFilter,它对图像的亮度执行 Sobel 边缘检测,以及 GPUImage3x3ConvolutionFilter,它允许您提供通用的 3x3 卷积核以应用于任意图像。对于实时视频,这些可以轻松地实时处理传入的帧。对于 UIImage,这些过滤器的运行速度比在 CPU 上执行的卷积快 6-10 倍。

根据您的具体问题,Ken 的建议是一个很好的建议,但实际上我发现 Apple 在链接文章中建议的数据复制方法实际上最终比在位图上下文中重绘图像要慢。这看起来很奇怪,但我在基准测试中得到了一致的结果。您在上面展示的 Core Graphics 绘图是我发现的访问原始 UIImage 像素数据的最快方法。

于 2012-05-16T16:22:19.077 回答