使用gd在php中调整图像大小后的黑色背景

Posted

技术标签:

【中文标题】使用gd在php中调整图像大小后的黑色背景【英文标题】:Black background after resizing image in php using gd 【发布时间】:2014-03-15 01:06:42 【问题描述】:

我使用下面的代码来调整图像大小(jpg、png、gif)。代码运行良好。但问题是在调整图像大小后,所有透明图像(png 和 gif)都有黑色背景。

如何保持透明度,使调整大小的图像不会有黑色背景?

 $target = 'uploads/'.$newname;

 move_uploaded_file( $_FILES['file']['tmp_name'], $target);;

 $filename=$newname;
 if($ext=='jpg'||$ext=='jpeg') 
        $im = imagecreatefromjpeg('uploads/'.$filename);
     else if ($ext=='gif') 
        $im = imagecreatefromgif('uploads/'.$filename);
     else if ($ext=='png') 
        $im = imagecreatefrompng('uploads/'.$filename);
    
    $ox = imagesx($im);
    $oy = imagesy($im);
    $nm = imagecreatetruecolor(400, 300);
    imagecopyresized($nm, $im, 0,0,0,0,400,300,$ox,$oy);
     imagejpeg($nm,  'thumbnails/' . $filename);

【问题讨论】:

相关帖子:***.com/questions/5688954/… 【参考方案1】:

imagesavealpha() 设置标志以尝试保存完整的 Alpha 通道 保存 PNG 时的信息(相对于单色透明度) 图片。

您必须取消设置 alphablending (imagealphablending($im, false)),以 使用它。

尝试添加

imagealphablending( $nm, FALSE );
imagesavealpha( $nm, TRUE );

这里:

.
.
$nm = imagecreatetruecolor(400, 300);
imagealphablending( $nm, FALSE );
imagesavealpha( $nm, TRUE );
.
.

还可以考虑使用imagecopyresampled 而不是imagecopyresized。

imagecopyresampled() 平滑地插入像素值,因此,特别是在减小图像尺寸时仍能保持很大的清晰度。

使用imagecopyresampled($nm, $im, 0,0,0,0,400,300,$ox,$oy);

而不是 imagecopyresized($nm, $im, 0,0,0,0,400,300,$ox,$oy);

【讨论】:

抱歉,它适用于 png 图像。但不适用于 gif。虽然它适用于 png,但获得的图像清晰度很差......颜色像那样传播。不能使用。有没有办法给白色背景而不是透明度?? 尝试使用imagecopyresampled 而不是imagecopyresized【参考方案2】:

我也遇到过类似的问题,使用时还是会出现黑色背景:

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

我发现以下组合是成功的:

imagecolortransparent($image, imagecolorallocate($thumbnail, 0, 0, 0));
imagealphablending($image, false);

【讨论】:

以上是关于使用gd在php中调整图像大小后的黑色背景的主要内容,如果未能解决你的问题,请参考以下文章

上传和调整 Png 大小会产生黑色背景图像

PHP中的图像叠加;黑色背景?

调整透明图像(UIImage)的大小而不获得黑色背景

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

将矩形图像调整为正方形,保持比例并用黑色填充背景

调整大小以适合盒子并将“空”部分的背景设置为黑色