我使用下面的代码来调整图像大小(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);
答案 0 :(得分: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);
答案 1 :(得分:1)
我也有类似的麻烦,使用时仍会出现黑色背景:
imagealphablending($image, false);
imagesavealpha($image, true);
我发现以下组合是成功的:
imagecolortransparent($image, imagecolorallocate($thumbnail, 0, 0, 0));
imagealphablending($image, false);