找出PNG是8位还是24位和alpha

时间:2013-04-18 11:41:03

标签: ios cocoa-touch cocoa png

鉴于UIImage / NSImageNSData实例,如果PNG为8位或24位,您如何找到以编程方式?如果它有alpha通道?

是否有任何Cocoa / Cocoa Touch API可以帮助解决这个问题?

为避免重复,这里是问题的non-programatic answer,这是找出if an image is a PNG的方法。

1 个答案:

答案 0 :(得分:4)

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

请参阅PNG Specification

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

所以,代码应该是:

  1. 跳过前8个字节(签名)
  2. 跳过4个字节(IHDR块长度)
  3. 跳过4个字节(IHDR块类型=“IHDR”)
  4. 阅读IHDR
  5.   

    宽度:4个字节
         高度:4个字节
         位深度:1个字节
         颜色类型:1字节
         压缩方法:1字节
         过滤方式:1字节
         隔行扫描方式:1字节

    对于alpha,您还应该检查文件中是否有tRNS(透明度)块。要查找块,您可以使用以下算法:

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

      要查找有关UIImage个实例的信息,请获取其CGImage并使用CGImageGet...个函数之一。