菜鸟教程小白 发表于 2022-12-13 02:18:37

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]
查看完整版本: ios - 查明 PNG 是 8 位还是 24 位和 alpha