从格式不受支持的 UIImage 中获取像素数据?
Posted
技术标签:
【中文标题】从格式不受支持的 UIImage 中获取像素数据?【英文标题】:Get pixel data from a UIImage that is in an unsupported format? 【发布时间】:2011-05-08 19:02:38 【问题描述】:作为this question的特例:
如果你的 UIImage 的格式不受支持,你会怎么做?就我而言,我有一个从文件中读取的单色 UIImage 对象。每个像素都有 8 位颜色(白色)数据,后跟 8 位 alpha 数据。格式不受支持,但图像在 iPhone 屏幕上显示得很好。
但是由于格式不受支持,因此无法按照引用问题中的说明获取像素数据。那我该怎么办?
【问题讨论】:
【参考方案1】:这样的工作是否有效,本质上是将图像转换为单色位图以操作像素数据。
CGImageRef cgImage = [image CGImage];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, CGImageGetWidth(cgImage), CGImageGetHeight(cgImage), 8, CGImageGetWidth(cgImage)*2, colorSpace, kCGImageAlphaLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), cgImage);
UInt8 *data = CGBitmapContextGetData(bitmapContext);
int numComponents = 2;
int bytesInContext = CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext);
int white;
int alpha;
for (int i=0; i < bytesInContext; i+= numComponents)
white = data[i];
alpha = data[i+1];
【讨论】:
bitmapContext 返回为零,因为它不受支持。我想我可以尝试对它撒谎并声称我有 RGB,每个像素 16 位,每个组件 5 位,并且不支持 alpha,并从那里获取数据。可能工作;肯定不会满足。【参考方案2】:您必须渲染为已知/支持的像素格式。只需设置一个灰度或 24BPP 的位图渲染目标,然后以 1:1 的纵横比将图像绘制到像素缓冲区中,因此无需调整大小。然后将已知格式结果检查为字节或字大小的像素。您只需要担心 ios 上的 sRGB 色彩空间,这样可以让事情变得简单,您可以直接从像素缓冲区中读取像素值。
【讨论】:
以上是关于从格式不受支持的 UIImage 中获取像素数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 获取像素数据?
获取 UIImageView 中 pan On UIImage 的像素位置
从 Windows 上的 QCamera 获取支持的像素格式