从格式不受支持的 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 获取支持的像素格式

在swift中从UIImage / CGImage获取像素数据作为数组

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

我想快速获取/设置 UiImage 中像素的 RGBA 值?