PHP调整保存PNG图像时部分图像输出全黑问题咨询
PHP处理指定PNG链接输出全黑的原因及解决方案
第一个图像处理失败和URL本身可访问性无关,也和图像是否带透明背景无关,你的代码里的透明保留逻辑对无透明PNG也可以正常兼容,核心问题有两个:
- 你给第一条Bing图像URL手动添加了
.png后缀,但该URL实际返回的是JPEG格式图像,调用imagecreatefrompng()读取非PNG格式资源会直接返回false,你加了@错误抑制符把报错信息屏蔽了,无法感知到资源创建失败的问题。 - 后续
imagecopyresampled()操作传入了无效的原始图像资源,最终输出的只有你预先填充的全透明画布,在不支持透明背景的预览场景下就会显示为全黑。
验证方法
你可以直接访问第一条URL查看响应头的Content-Type字段,会看到值为image/jpeg而非image/png;也可以先去掉代码里imagecreatefrompng前面的@,就能看到明确的格式不匹配报错。
修复方案
不要硬编码用imagecreatefrompng读取图像,根据getimagesize返回的MIME类型动态选择对应的创建方法即可,修改逻辑参考:
<?php $id = "example"; $originalFile = "https://th.bing.com/th/id/OIP.v_YT6iKMW6sOOVdCxVYQkwHaE8?pid=ImgDet&rs=1.png"; list($originalWidth, $originalHeight, $imageType) = getimagesize($originalFile); // 动态判断图像格式创建资源 switch ($imageType) { case IMAGETYPE_JPEG: $originalImage = imagecreatefromjpeg($originalFile); break; case IMAGETYPE_PNG: $originalImage = imagecreatefrompng($originalFile); break; default: die("不支持的图像格式"); } $newHeight = 255; $newWidth = 255; // 创建画布逻辑保留原有即可 $resizedImage = imagecreatetruecolor($newWidth, $newHeight); imagesavealpha($resizedImage, true); $color = imagecolorallocatealpha($resizedImage, 0, 0, 0, 127); imagefill($resizedImage, 0, 0, $color); imagecopyresampled( $resizedImage, $originalImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight ); header('Content-type: image/png'); $imageName = $id . ".png"; if(imagepng($resizedImage, "images/" . $imageName)){ echo "Image uploaded"; } // 用完记得销毁资源 imagedestroy($originalImage); imagedestroy($resizedImage); ?>
另外不建议在生产环境用@抑制错误,容易掩盖核心问题,你可以通过修改php.ini的display_errors配置来控制错误的输出场景,不要直接屏蔽函数报错。
内容的提问来源于stack exchange,提问作者user16071820
相关产品推荐
相关产品推荐

