【发布时间】:2013-04-11 12:13:54
【问题描述】:
给定UIImage/NSImage 或NSData 实例,如何以编程方式找出 PNG 是 8 位还是 24 位?如果它有 alpha 通道?
是否有任何 Cocoa/Cocoa Touch API 对此有帮助?
为避免重复,这里是问题的non-programatic answer,这是查找if an image is a PNG的方法。
【问题讨论】:
标签: ios cocoa-touch cocoa png
给定UIImage/NSImage 或NSData 实例,如何以编程方式找出 PNG 是 8 位还是 24 位?如果它有 alpha 通道?
是否有任何 Cocoa/Cocoa Touch API 对此有帮助?
为避免重复,这里是问题的non-programatic answer,这是查找if an image is a PNG的方法。
【问题讨论】:
标签: ios cocoa-touch cocoa png
作为一个长期在J2ME平台上编程的人,我对PNG格式非常了解。如果您将原始数据作为 NSData 实例,则查找信息非常容易,因为 PNG 格式非常简单。
PNG 文件以签名开始,然后包含一系列块。你只对第一个块感兴趣,IHDR。
所以,代码应该是这样的:
宽度:4 个字节
高度:4 个字节
位深:1 字节
颜色类型:1 字节
压缩方式:1字节
过滤方式:1字节
交错方式:1字节
对于 alpha,您还应该检查文件中是否有 tRNS(透明度)块。要找到一个块,您可以使用以下算法:
编辑:
要查找有关UIImage 实例的信息,请获取其CGImage 并使用CGImageGet... 函数之一。
需要注意的是,PNG文件中的所有整数值都是以Big-endian格式读取的。
【讨论】:
CGImage 与原始数据具有相同的属性?
CGImage 肯定具有正确的属性 :) 在谈到 iOS PNG 加载器时,alpha 信息应该是正确的,但不确定位深度。另请参阅stackoverflow.com/questions/3251595/…,了解有关调色板 PNG 图像的信息。