为何PNG图片处理函数无法生成图片?
问题排查与解决
核心错误:imagepng的压缩参数非法
你代码里imagepng()的第三个参数传了100,但这个参数的合法范围是0-9(0无压缩,9最高压缩),超出范围会直接导致函数执行失败,这是生成不了图片的主要原因。把两处的100改成合法值,比如9或者0即可。
其他需要检查的点
- 确认
$destination_w和$destination_m对应的文件夹实际存在,并且服务器对这两个文件夹有写入权限(可以用is_writable($destination_w)来快速验证)。 - 处理PNG缩略图时,因为PNG带透明通道,直接用
imagecreatetruecolor生成的缩略图会丢失透明属性,变成黑色背景。如果需要保留透明,要在imagecreatetruecolor之后、imagecopyresized之前加两行代码:imagealphablending($thumb, false); imagesavealpha($thumb, true); - 开启PHP错误提示,在代码开头加:
能直接看到函数执行时的具体报错,方便排查其他隐藏问题。error_reporting(E_ALL); ini_set('display_errors', 1);
修改后的示例代码片段
else if ($_SESSION['mime'] === 'image/png'){ $img = imagecreatefrompng($source.'/'.$_SESSION['image']); $blackcolor = imagecolorallocate($img, 0, 0, 0); imagestring($img, 3,15, 30, $_SESSION['watermark'], $blackcolor); // 修正压缩级别为合法值 imagepng($img, $destination_w.'/'.$_SESSION['image'], 9); imagedestroy($img); $img = imagecreatefrompng($source.'/'.$_SESSION['image']); list($width, $height) = getimagesize($source.'/'.$_SESSION['image']); $thumb = imagecreatetruecolor(200, 125); // 新增代码保留PNG透明属性 imagealphablending($thumb, false); imagesavealpha($thumb, true); imagecopyresized($thumb, $img, 0, 0, 0, 0, 200, 125, $width, $height); // 同样修正压缩级别 imagepng($thumb, $destination_m.'/'.$_SESSION['image'], 9); imagedestroy($img); imagedestroy($thumb); }
内容的提问来源于stack exchange,提问作者zuzqqa
相关产品推荐
相关产品推荐

