【问题标题】:Fastest way to read PNG metadata in PHP在 PHP 中读取 PNG 元数据的最快方法
【发布时间】:2011-05-04 20:25:12
【问题描述】:

我想从 PNG 文件中提取两个字段。即,几何字段和元数据中的字段之一。

我能做到这一点的最快方法是什么?我已经对当前执行此操作的脚本进行了基准测试,到目前为止,最慢的操作是在 PNG 文件上执行实际的 ImageMagick“识别”程序。 (0.4 秒与 0.0001 秒解析几何输出数组,8.39E-5 秒解析元数据中的关键短语)

提前感谢您的帮助,

乔纳森

【问题讨论】:

  • 向我们展示您的代码,这样我们就不必复制它了
  • 我的是一个非常简单的 exec() 调用 'identify -verbose {$file_name}'(当然还有转义)。该调用本身需要 0.4 秒。

标签: php parsing png metadata imagemagick


【解决方案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 标头的简洁解释。您的回答让我走上了正确的道路 - 谢谢!
猜你喜欢
  • 2012-05-17
  • 2011-01-12
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多