我有一个脚本可以调整上传图像的大小。它适用于 PNG 和 JPG,但不适用于 GIF。对于 GIF,它应该将它们转换为 JPG,然后调整它们的大小。转换有效,但随后无法调整大小...
function resize_image($file, $maxWidth, $maxHeight) {
$jpgFile = substr_replace($file, 'jpeg', -3);
$fileType = strtolower(substr($file, -3));
...
if ($fileType == 'gif') {
$test = imagecreatefromgif($file);
imagejpeg($test, $jpgFile);
$src = imagecreatefromjpeg($jpgFile);
$dst = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagejpeg($dst, $jpgfile);
}
}
我认为在从 gif 创建图像后不需要输出图像 - imagecreatefromgif
将图像读入内存,您应该能够做到这一点:
$src = imagecreatefromgif($file);
$dst = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagejpeg($dst, $jpgfile);
您使用的是哪个版本的 GD 库?根据官方的PHP文档:
GIF 支持已从 1.6 版的 GD 库中删除,并添加了 回到版本 2.0.28。此功能在这两个之间不可用 版本。
我最终绕过了将 GIF 转换为 JPG,并直接调整了 GIF 的大小。但是,为了保持透明度(默认情况下它将透明背景转换为黑色,这就是我最初在调整大小之前先将其转换为JPG的原因),我必须添加一些说明。
$src = imagecreatefromgif($file);
$dst = imagecreatetruecolor($newWidth, $newHeight);
imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
imagealphablending($dst, false);
imagesavealpha($dst, true);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagegif($dst, $file);