使用php Imagick调整PNG大小并保留背景

3
我正在尝试使用 cropThumbnailImage 调整图像大小。我使用 cropThumbnailImage ,因为它可以将图像的尺寸调整为原始图像的较短长度,并在两侧等量地裁剪图像的较长一侧,以使图像的中心部分保持未被裁剪。这对于 jpg 图像很好用,但对于 png 图像来说,调整大小后的 png 图像会出现黑色背景。
以下是我使用的代码。
    $image = new \Imagick($src);

    // resize & crop
    $image->cropThumbnailImage($width, $height);

    // save new resized file
    $image->writeImage($dest);

运行以下代码以处理以下png图像。

http://tuxpaint.org/stamps/stamps/animals/birds/cartoon/tux.png http://www.cs.csubak.edu/~mcabrera/CS211/transparent.png http://www.tcarms.com/media/assets/productPhotos/006_G2%20Contender/png/Pistol_12in_Ribbed_Blued_2720.png

输出的图像按要求进行了调整,但png图像的背景变成了黑色。

尝试从这里添加以下行,但不起作用。

imagealphablending( $image, false );
imagesavealpha( $image, true );

在网络上有其他解决方案可以实现PNG图像的调整大小,但我没有找到像cropThumbnailImage那样调整图像大小的解决方案。


3
你期望什么?JPEG 图像并没有透明度。 - Carsten
JPG格式的图片不支持透明度... 请使用PNG或GIF格式的文件... - NETCreator Hosting - WebDesign
感谢大家指出压缩问题。我已经将其删除并进行了测试,但图像似乎仍然会出现黑色背景。 - Venkat Kotra
为什么这个问题被关闭了?我愿意添加更多细节来获得答案。 - Venkat Kotra
@ITChristian 感谢您的时间。这段代码似乎还无法正常工作。 - Venkat Kotra
显示剩余8条评论
2个回答

2
透明度可以使用以下代码片段来保留:
$im = new Imagick($imgPath);
$im->setImageFormat('png');
$im->writeImage('/files/thumbnails/new_title.png');

0
  1. 你的JPG没有透明度... JPG不是一种透明图像... 这里需要使用PNG和GIF。

  2. 如果你指的是PNG,有一个PHP代码可以帮助你调整具有透明度的PNG大小:

$x = "裁剪的X坐标"; $y = "裁剪的Y坐标"; $w = "宽度"; $h = "高度"; $img = imagecreatefrompng($img_path); imagealphablending($img, true); $img_cropped = imagecreatetruecolor($w, $h); imagesavealpha($img_cropped, true); imagealphablending($img_cropped, false); $transparent = imagecolorallocatealpha($img_cropped, 0, 0, 0, 127); imagefill($img_cropped, 0, 0, $transparent); imagecopyresampled($img_cropped, $img, 0, 0, $x, $y, $w, $h, $w, $h); // 你也可以在这里使用imagecopy() imagepng($img_cropped, "your_image_cropped.png", 2); imagedestroy($img); imagedestroy($img_cropped); $image = imagecreatefrompng($filename); $new_image = imagecreatetruecolor($width, $height); // 新的宽度和高度 imagealphablending($new_image, false); imagesavealpha($new_image, true); imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image)); $image = $new_image; // 保存 imagealphablending($image, false); imagesavealpha($image, true); imagepng($image, $filename);
不要忘记定义$filename、$width和$height!!!

问题询问如何使用Imagick而不是GD库调整png的大小。 - zeros-and-ones
当使用半透明像素调整图像大小时,会导致灰色边框。 - Ruttyj

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