在PHP中读取PNG元数据的最快方法

3
我想从PNG文件中提取两个字段,即几何字段和元数据中的一个字段。
我该如何最快地完成这个任务?我已经对我的脚本进行了基准测试,目前执行这个任务最慢的操作是在PNG文件上执行实际的ImageMagick "identify"程序。(解析输出数组以获取几何信息需要0.4秒,解析元数据中的关键短语只需要0.0001秒)
感谢您提前的帮助,
Jonathan

展示你的代码,这样我们就不必复制它了。 - bcosca
我的代码非常简单,只是一个对'identify -verbose {$file_name}'的exec()调用(当然需要转义)。这个调用本身需要0.4秒。 - Jonathan Chan
1个回答

1

我不熟悉在PHP中没有子进程调用的情况下使用任何现成的库或类来完成它,但如果找不到一个,编写自己的代码肯定是可行的。

PNG是一种相当简单的块流格式,因此寻找特定块并提取一些头字段是微不足道的。

你只需要读取和检查8字节的89 50 4E 47 0D 0A 1A 0A PNG头,然后交替读取8字节(块长度加类型)并使用长度跳过块,直到找到所需的块类型。

对于几何图形,假设PNG遵循规范,这就是如何进行的:

  1. 读取并验证PNG头(8个字节)
  2. 读取并检查第一个块的头部(8个字节)
    1. 成功。 type = IHDR
    2. 读取额外的8个字节以获取几何信息(宽度,高度。每个4个字节)
  3. 如果您想要的其他字段不在IHDR中,请使用步骤2中的块大小搜索下一个块以寻找所需的其他字段。

我可能需要5到15分钟才能用Python编写类似的东西。(我已经用RAR和GIF做过类似的事情)也许在PHP中需要15到25分钟,因为我在其中进行低级文件I/O的经验较少。


感谢您对PNG头部的简明解释。您的回答让我走上了正确的道路 - 谢谢! - Jonathan Chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接