【发布时间】:2011-11-10 03:57:02
【问题描述】:
我正在加载 this (very small) image 使用:
UIImage* image = [UIImage named:@"someFile.png"];
图像为 4x1,包含从左到右依次为红色、绿色、蓝色和白色的像素。
接下来,我从底层的 CGImage 中获取像素数据:
NSData* data = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
现在,由于某种原因,像素数据的布局因 iOS 设备而异。
当我在模拟器或 iPhone 4 上运行应用程序时,像素数据如下所示:
(255,0,0),(0,255,0),(0,0,255),(255,255,255)
因此,像素为每个像素 3 个字节,蓝色为最高有效字节,红色为最低有效字节。所以我猜你称之为 BGR?
当我检查 CGBitmapInfo 时,我可以看到 kCGBitmapByteOrderMask 是 kCGBitmapByteOrderDefault。我找不到任何解释什么是“默认”的地方。
另一方面,当我在第一代 iPhone 上运行它时,像素数据如下所示:
(0,0,255,255),(0,255,0,255),(255,0,0,255),(255,255,255,255)
所以每个通道有 4 个字节,alpha 是最重要的字节,蓝色是最不重要的。所以……这叫 ARGB?
我一直在查看 CGBitmapInfo 以获取有关如何检测布局的线索。在第一代 iPhone 上,kCGBitmapAlphaInfoMask 是 kCGImageAlphaNoneSkipFirst。这意味着最高有效位被忽略。所以这是有道理的。在第一代 iPhone 上,kCGBitmapByteOrderMask 是 kCGBitmapByteOrder32Little。我不知道这意味着什么,也不知道如何将其与 R、G 和 B 组件在内存中的布局方式联系起来。任何人都可以对此有所了解吗?
谢谢。
【问题讨论】:
-
我正在寻找关于内存顺序的类似答案。
kCIFormatRGBAh是否意味着在内存顺序中首先出现红色,最后出现 alpha 通道 {red float16, green float16, blue float16, alpha float16}。如果是这样,那么kCIFormatBGRA8只能表示相同的意思,即蓝色出现在内存的第一个字节中。那么回应“那叫ARGB?”,不就是BGRA吗?
标签: iphone ios quartz-graphics pixels cgimage