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

Ios 找出PNG是8位还是24位和alpha,ios,cocoa-touch,cocoa,png,Ios,Cocoa Touch,Cocoa,Png,给定UIImage/NSImage或NSData实例,如何通过编程确定PNG是8位还是24位?如果它有阿尔法通道呢 是否有Cocoa/Cocoa Touch API对此有所帮助 为了避免重复,这里是问题的答案,这里有一种方法可以找到答案。作为一个在J2ME平台上编程很长时间的人,我非常了解PNG格式。如果将原始数据作为NSData实例,则查找信息非常容易,因为PNG格式非常简单 看 PNG文件以签名开始,然后包含一系列块。你只对第一块感兴趣,IHDR 因此,代码应遵循以下内容: 跳过前8个字节的

给定UIImage/NSImage或NSData实例,如何通过编程确定PNG是8位还是24位?如果它有阿尔法通道呢

是否有Cocoa/Cocoa Touch API对此有所帮助


为了避免重复,这里是问题的答案,这里有一种方法可以找到答案。

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

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

因此,代码应遵循以下内容:

跳过前8个字节的签名 跳过4字节IHDR块长度 跳过4字节IHDR区块类型=IHDR 阅读IHDR 宽度:4字节 高度:4字节 位深度:1字节 颜色类型:1字节 压缩方法:1字节 过滤方法:1字节 隔行扫描方法:1字节

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

读取块长度为4字节 读取块类型4字节 检查区块类型是否为我们正在寻找的类型 跳过块长度字节 跳过4个字节的CRC 重复 编辑:

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

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

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

因此,代码应遵循以下内容:

跳过前8个字节的签名 跳过4字节IHDR块长度 跳过4字节IHDR区块类型=IHDR 阅读IHDR 宽度:4字节 高度:4字节 位深度:1字节 颜色类型:1字节 压缩方法:1字节 过滤方法:1字节 隔行扫描方法:1字节

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

读取块长度为4字节 读取块类型4字节 检查区块类型是否为我们正在寻找的类型 跳过块长度字节 跳过4个字节的CRC 重复 编辑:

要查找有关UIImage实例的信息,请获取其CGImage并使用其中一个CGImageGet。。。功能。
需要注意的是,PNG文件中的所有整数值都是以大端格式读取的。

+1请记住,PNG可以通过在颜色类型IHDR属性中读取alpha通道来实现透明度,或者,对于某些图像类型,可以通过包含tRNS块来实现透明度。更多信息是否保证CGImage将具有与原始数据相同的属性?@hpique这实际上取决于映像的创建方式。我知道iOS PNG加载程序无法加载一些不寻常的PNG格式。我记得在一个ocation中实现了我自己的PNG解析器,由我的实现创建的CGImage肯定具有正确的属性:当谈到iOS PNG加载器时,alpha信息应该是正确的,不确定位深度。另请参阅以获取有关调色板PNG图像的信息。+1请记住,PNG可以通过在颜色类型IHDR属性中读取alpha通道来实现透明度,或者对于某些图像类型,通过包含tRNS块来实现透明度。更多信息是否保证CGImage将具有与原始数据相同的属性?@hpique这实际上取决于映像的创建方式。我知道iOS PNG加载程序无法加载一些不寻常的PNG格式。我记得在一个ocation中实现了我自己的PNG解析器,由我的实现创建的CGImage肯定具有正确的属性:当谈到iOS PNG加载器时,alpha信息应该是正确的,不确定位深度。有关调色板PNG图像的信息,请参见。