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

发布于 2024-09-30 09:51:24 字数 216 浏览 2 评论 0原文

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

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

提前感谢您的帮助,

乔纳森

I would like to extract two fields from a PNG file. Namely, the geometry field and one of the fields from the metadata.

What is the fastest way I could go about doing this? I have benchmarked my script that currently performs this and by far the slowest action is executing the actual ImageMagick "identify" program on the PNG file. (.4 seconds vs .0001 seconds to parse the outputted array for the geometry and 8.39E-5 seconds to parse key phrases from the metadata)

Thanks in advance for any help,

Jonathan

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

大姐,你呐 2024-10-07 09:51:24

我不熟悉任何现成的库或类,可以在没有子进程调用的情况下在 PHP 中执行此操作,但如果您找不到,编写自己的库或类肯定是一种可行的方法。

PNG 是一种相当简单的块流格式,因此查找特定块并提取一些标头字段非常简单。

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

对于几何形状,假设 PNG 遵循规范,具体情况如下:

  1. 读取并验证 PNG 标头(8 字节)
  2. 读取并检查第一个块的标头(8 字节)
    1. 成功。 类型 = IHDR
    2. 读取额外 8 个字节的几何图形(宽度、高度。各 4 个字节)
  3. 如果您想要的其他字段不在 IHDR,使用步骤 2 中的块大小来查找下一个块,以搜索您要查找的其他字段通缉。

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

I'm not familiar with any ready-made libraries or classes to do it in PHP without a subprocess call, but if you can't find one, writing your own would definitely be the way to go.

PNG's a fairly simple block stream format, so seeking to a specific block and extracting some header fields is trivial.

All you'd need is something which reads and checks the 8-byte 89 50 4E 47 0D 0A 1A 0A PNG header and then alternates between reading 8 bytes (chunk length plus type) and seeking past the block using the length until you hit the chunk type you want.

For the geometry, assuming the PNG follows the spec, here's how it'd go:

  1. Read and verify PNG header (8 bytes)
  2. Read and check header of first block (8 bytes)
    1. Success. type = IHDR
    2. Read additional 8 bytes for geometry (width, height. 4 bytes each)
  3. If the other field you wanted isn't in IHDR, use the chunk size from step 2 to seek to the next block in search of the other field you wanted.

It'd probably take me 5 to 15 minutes to whip something like that up in Python. (I've done similar things with RAR and GIF) Maybe 15 to 25 in PHP since I've got less experience doing low-level file I/O in it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文