我理解位图布局和像素格式主题相当不错,但在处理通过加载的png/jpeg图像时出现问题NSImage- 我无法弄清楚我得到的是预期的行为还是错误.
let nsImage:NSImage = NSImage(byReferencingURL: …)
let cgImage:CGImage = nsImage.CGImageForProposedRect(nil, context: nil, hints: nil)!
let bitmapInfo:CGBitmapInfo = CGImageGetBitmapInfo(cgImage)
Swift.print(bitmapInfo.contains(CGBitmapInfo.ByteOrderDefault)) // True
Run Code Online (Sandbox Code Playgroud)
我的kCGBitmapByteOrder32Host是小端,这意味着像素格式也是小端 - 在这种情况下是BGRA.但是...... png格式是规范的大端,这就是字节实际排列在数据中的方式 - 与位图信息告诉我的方式相反.
有人知道发生了什么吗?当然,系统会以某种方式知道如何处理这个问题,因为png正确显示.是否有检测CGImage像素格式的防弹方式?GitHub提供完整的演示项目.
PS我正在通过CFDataGetBytePtr缓冲区将原始像素数据复制到另一个库缓冲区,然后进行处理和保存.为此,我需要明确指定像素格式.我正在处理的实际图像(我检查过的任何png/jpeg文件)显示正确,例如:

但是相同图像的位图信息给出了不正确的字节序信息,导致位图被处理为BGRA像素格式而不是实际的RGBA,当我处理它时,结果如下所示:

生成的图像演示了红色和蓝色像素之间的颜色交换,如果明确指定RGBA像素格式,一切都很完美,但我需要将此检测自动化.
PPS文档简要提到这CGColorSpace是定义像素格式/字节顺序的另一个重要变量,但我没有提到如何将它从那里拿出来.