【问题标题】:Find out if PNG is 8 or 24 bits and alpha查明 PNG 是 8 位还是 24 位和 alpha
【发布时间】:2013-04-11 12:13:54
【问题描述】:

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

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

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

【问题讨论】:

标签: ios cocoa-touch cocoa png


【解决方案1】:

作为一个长期在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文件中的所有整数值都是以Big-endian格式读取的。

【讨论】:

  • +1 请记住,PNG 可以通过具有 Alpha 通道(您在“颜色类型”IHDR 属性中阅读)或者对于某些图像类型,通过包含 tRNS 块来实现透明度.更多信息here
  • 是否保证CGImage 与原始数据具有相同的属性?
  • @hpique 这实际上取决于图像的创建方式。我知道 iOS PNG 加载器无法加载一些不常见的 PNG 格式。我记得有一次实现了我自己的 PNG 解析器,而我的实现创建的 CGImage 肯定具有正确的属性 :) 在谈到 iOS PNG 加载器时,alpha 信息应该是正确的,但不确定位深度。另请参阅stackoverflow.com/questions/3251595/…,了解有关调色板 PNG 图像的信息。
猜你喜欢
  • 2017-01-22
  • 2014-02-02
  • 2010-12-18
  • 2016-07-27
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多