ios - 查明 PNG 是 8 位还是 24 位和 alpha
<p><p>给定一个 <code>UIImage</code>/<code>NSImage</code> 或 <code>NSData</code> 实例,如果 PNG 是8位还是24位?如果它有 alphachannel ?</p>
<p>是否有任何 Cocoa/Cocoa Touch API 对此有帮助?</p>
<p>为避免重复,这里是 <a href="https://stackoverflow.com/questions/6278159/find-out-if-png-is-8-or-24" rel="noreferrer noopener nofollow">non-programatic answer</a>对于这个问题,这里有一个方法来找出 <a href="https://stackoverflow.com/questions/4147311/finding-image-type-from-nsdata-or-uiimage" rel="noreferrer noopener nofollow">if an image is a PNG</a> .</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>作为一个长期在J2ME平台上编程的人,我对PNG格式非常了解。如果您将原始数据作为 <code>NSData</code> 实例,则查找信息非常容易,因为 PNG 格式非常简单。</p>
<p>见 <a href="http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html" rel="noreferrer noopener nofollow">PNG Specification</a> </p>
<p>PNG 文件以签名开始,然后包含一系列 block 。您只对第一个 block<code>IHDR</code> 感兴趣。</p>
<p>所以,代码应该是这样的:</p>
<ol>
<li>跳过前 8 个字节(签名)</li>
<li>跳过 4 个字节(IHDRblock 长度)</li>
<li>跳过 4 个字节(IHDRblock 类型 = "IHDR")</li>
<li>阅读 IHDR</li>
</ol>
<blockquote>
<p>Width: 4 bytes<br/>
Height: 4 bytes<br/>
Bit depth: 1 byte<br/>
Color type: 1 byte<br/>
Compression method: 1 byte<br/>
Filter method: 1 byte<br/>
Interlace method: 1 byte<br/></p>
</blockquote>
<p>对于 alpha,您还应该检查文件中是否存在 <code>tRNS</code>(透明度) block 。要找到一个 block ,您可以使用以下算法:</p>
<ol>
<li>读取 block 长度(4 个字节)</li>
<li>读取 block 类型(4 字节)</li>
<li>检查 block 类型是否是我们要查找的类型</li>
<li>跳过 block 长度字节</li>
<li>跳过 4 个字节的 CRC</li>
<li>重复</li>
</ol>
<p><b>编辑:</b></p>
<p>要查找有关 <code>UIImage</code> 实例的信息,请获取其 <code>CGImage</code> 并使用 <code>CGImageGet...</code> 函数之一。
需要注意的是,PNG文件中的<strong>所有</strong>整数值都是以<em>Big-endian</em>格式读取的。</p></p>
<p style="font-size: 20px;">关于ios - 查明 PNG 是 8 位还是 24 位和 alpha,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/16081966/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/16081966/
</a>
</p>
页:
[1]