在 PHP 中读取 PNG 元数据的最快方法
我想从 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不熟悉任何现成的库或类,可以在没有子进程调用的情况下在 PHP 中执行此操作,但如果您找不到,编写自己的库或类肯定是一种可行的方法。
PNG 是一种相当简单的块流格式,因此查找特定块并提取一些标头字段非常简单。
您所需要的只是读取并检查 8 字节
89 50 4E 47 0D 0A 1A 0A
PNG 标头,然后在读取 8 字节(块长度加类型)和查找块之外之间交替。使用长度直到达到所需的块类型。对于几何形状,假设 PNG 遵循规范,具体情况如下:
类型 = IHDR
我可能需要 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:
type = IHDR
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.