创建PNG图像设置DPI的清晰解决方案

3
我希望能在网站上使用PHP创建PNG图片,并按照定义的比例进行打印。因此,我想直接使用PHP设置图像的DPI值。不幸的是,我没有找到任何可用于此目的的函数调用。
是否有任何函数可以设置/更新PNG文件的元数据?也许使用HTML包装器和CSS样式表进行打印的其他解决方案更合理。但我更喜欢“直接在图像上”的方法...
3个回答

2
PNG文件可以包含任意的头信息。如果您查看PNG规范,您可以向给定的PNG添加tEXt块(也称为数据块)。有关tEXT数据块的更多信息,请参见规范的第4.2.3节。
例如,Adobe Photoshop向其PNG添加元XML。我不确定GD是否支持此功能,但建议从那里开始寻找。这是完全可能的。
以下是一些处理解析PNG数据块的PHP代码。这可能会指引你朝正确的方向前进。http://code.svn.wordpress.org/imagelibs/libpng.php 下面是一个文本编辑器的PNG截图,显示了Photoshop生成的XML。https://dev59.com/0ErSa4cB1Zd3GeqPaOdg#14356339

嗯,http://code.svn.wordpress.org/imagelibs/libpng.php 代码似乎是手动解析块。这不是我要找的东西。但是,无论如何它提供了一些见解...谢谢。 - SDwarfs
这也是gd会做的事情。最终,它只是一些位(bits)。唯一的问题是它能多快地完成。如果你打算自己做,我强烈推荐在Windows上使用Hexworkshop。 - Homer6
1
@StefanK。这篇帖子似乎也证明了这一点:http://stackoverflow.com/questions/8842387/php-add-itxt-comment-to-a-png-image - Homer6
嗯,好的,最后一个解决方案似乎是一个选项。它更加紧凑,看起来像是可维护的代码... - SDwarfs
1
是的。据我所知,您可以在IHDR块之后的任何位置放置tEXT块(包括此代码放置的位置)。正如问题所述,这是一个快速而简单的解决方案,不会检查tEXT块是否已经存在。因此,如果您有更复杂的要求,可能需要使用上面的代码。还要记住,tEXT是Latin-1编码,而iTXt是UTF-8编码。有关编码的详细信息,请参见规范的4.2.3.3节。 - Homer6
为了设置物理分辨率,您不应使用文本块,这就是pHYs块被标准化的原因。 - leonbloy

1

pHYs 块(物理分辨率)可以让您设置 DPI(实际上是每米像素,但只是单位转换)。当然,PNG 阅读器可能会忽略它。

PHP 不包括(据我所知)读写完整的 PNG 元数据支持,您必须自己处理,参见 eg


0

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