在处理上传到我的网站的图像时,我看到了一些随机错误,其中某些 .png 文件会导致错误回显到输出缓冲区,这会搞乱返回服务器的响应。
错误是:
“使用 png_read_image 时应打开隔行处理”
我在某些情况下手动处理上传的文件时看到过这种情况,现在我也开始在我的 WordPress 安装上看到这种情况。我没有将这个问题标记为 WordPress,因为我怀疑它与 WordPress 有任何关系,而它一定是 PHP 中的某个问题。
我最初在 PHP 5 中看到了这个问题,但自从升级到 PHP 7 后我也看到了这个问题。我现在运行的是 PHP 7.1.9。
到目前为止,谷歌搜索还没有返回任何有意义的结果,似乎没有任何特定于 PHP 的答案,大多数答案都说用户需要在上传之前在源文件上启用隔行扫描,这对于网络服务器来说是不可接受的的立场,因为我无法控制用户上传的内容。上传后图像似乎仍然可以正常工作,我只需要一种方法来抑制此消息,这样就不会导致向用户显示错误。
错误消息确实提到使用
png_read_image()
,但是我没有在任何地方直接调用这个函数。也许它在内部某个地方调用它,但这使得调试非常困难。我能想到的最好的办法是它与 imagepng()
或 imagecreatefrompng()
有关。
现在我正在前端解决这个问题,在尝试解析响应之前我会删除错误文本。
如果这有点缺乏细节,我很抱歉,但我真的不知道现在还能提供什么。
我有此消息(PHP 7.2.3 + GD):
libpng warning: Interlace handling should be turned on when using png_read_image
还有其他一些
libpng warning: tRNS: invalid with alpha channel
libpng warning: iCCP: known incorrect sRGB profile
我的代码将来自不同来源(然后是不同质量)的 png 图像合并到一张图像中,在使用 Photoshop 处理某些图片后,消息消失了,但似乎有一个解决方法,请参阅下面的说明:
<?php
// Create an image instance
$im = imagecreatefromgif('php.gif');
// Enable interlancing
imageinterlace($im, true);
// Save the interlaced image
imagegif($im, './php_interlaced.gif');
imagedestroy($im);
?>
https://www.php.net/manual/en/function.imageinterlace.php
imageinterlace() 打开或关闭隔行扫描位。
为了澄清什么是交错:
imageinterlace() 函数是 PHP 中的内置函数,用于启用或禁用图像中的隔行扫描。隔行扫描(也称为交错)是一种对位图图像进行编码的方法,以便部分接收该图像的人看到整个图像的降级副本。网站上隔行图像和非隔行图像之间的一个区别是,前者首先以低质量版本加载,然后随着网站加载,其质量不断提高,而非隔行图像则以固定质量线加载网站加载时从上到下排列。