给定一个 UIImage /NSImage 或 NSData 实例,如果 PNG 是8位还是24位?如果它有 alpha channel ?
是否有任何 Cocoa/Cocoa Touch API 对此有帮助?
为避免重复,这里是 non-programatic answer对于这个问题,这里有一个方法来找出 if an image is a PNG .
Best Answer-推荐答案 strong>
作为一个长期在J2ME平台上编程的人,我对PNG格式非常了解。如果您将原始数据作为 NSData 实例,则查找信息非常容易,因为 PNG 格式非常简单。
见 PNG Specification
PNG 文件以签名开始,然后包含一系列 block 。您只对第一个 block IHDR 感兴趣。
所以,代码应该是这样的:
- 跳过前 8 个字节(签名)
- 跳过 4 个字节(IHDR block 长度)
- 跳过 4 个字节(IHDR block 类型 = "IHDR")
- 阅读 IHDR
Width: 4 bytes
Height: 4 bytes
Bit depth: 1 byte
Color type: 1 byte
Compression method: 1 byte
Filter method: 1 byte
Interlace method: 1 byte
对于 alpha,您还应该检查文件中是否存在 tRNS (透明度) block 。要找到一个 block ,您可以使用以下算法:
- 读取 block 长度(4 个字节)
- 读取 block 类型(4 字节)
- 检查 block 类型是否是我们要查找的类型
- 跳过 block 长度字节
- 跳过 4 个字节的 CRC
- 重复
编辑:
要查找有关 UIImage 实例的信息,请获取其 CGImage 并使用 CGImageGet... 函数之一。
需要注意的是,PNG文件中的所有整数值都是以Big-endian格式读取的。
关于ios - 查明 PNG 是 8 位还是 24 位和 alpha,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/16081966/
|