OGeek|极客世界-中国程序员成长平台

标题: ios - 查明 PNG 是 8 位还是 24 位和 alpha [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 02:18
标题: ios - 查明 PNG 是 8 位还是 24 位和 alpha

给定一个 UIImage/NSImageNSData 实例,如果 PNG 是8位还是24位?如果它有 alpha channel ?

是否有任何 Cocoa/Cocoa Touch API 对此有帮助?

为避免重复,这里是 non-programatic answer对于这个问题,这里有一个方法来找出 if an image is a PNG .



Best Answer-推荐答案


作为一个长期在J2ME平台上编程的人,我对PNG格式非常了解。如果您将原始数据作为 NSData 实例,则查找信息非常容易,因为 PNG 格式非常简单。

PNG Specification

PNG 文件以签名开始,然后包含一系列 block 。您只对第一个 block IHDR 感兴趣。

所以,代码应该是这样的:

  1. 跳过前 8 个字节(签名)
  2. 跳过 4 个字节(IHDR block 长度)
  3. 跳过 4 个字节(IHDR block 类型 = "IHDR")
  4. 阅读 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 ,您可以使用以下算法:

  1. 读取 block 长度(4 个字节)
  2. 读取 block 类型(4 字节)
  3. 检查 block 类型是否是我们要查找的类型
  4. 跳过 block 长度字节
  5. 跳过 4 个字节的 CRC
  6. 重复

编辑:

要查找有关 UIImage 实例的信息,请获取其 CGImage 并使用 CGImageGet... 函数之一。 需要注意的是,PNG文件中的所有整数值都是以Big-endian格式读取的。

关于ios - 查明 PNG 是 8 位还是 24 位和 alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16081966/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4