找出PNG是8位还是24位,并且alpha

问题描述 投票:2回答:1

给定UIImage / NSImageNSData实例,如何找出以编程方式 PNG是8位还是24位?如果它具有Alpha通道?

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

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

ios cocoa-touch cocoa png
1个回答
4
投票

作为在J2ME平台上进行长时间编程的人,我非常了解PNG格式。如果您将原始数据作为NSData实例,则由于PNG格式非常简单,因此查找信息非常容易。

请参见PNG Specification

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

因此,代码应遵循以下原则:

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

宽度:4个字节高度:4个字节位深度:1个字节颜色类型:1个字节压缩方式:1字节筛选方法:1个字节隔行方法:1个字节

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

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

编辑:

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

© www.soinside.com 2019 - 2024. All rights reserved.