问题描述
我使用此功能来调整图像大小,但如果它是带有alpha的透明GIF或PNG,我最终会看到带有黑色背景的丑陋令人毛骨悚然的图像,但它适用于jpg和普通png。
I use this function to resize images but i end up with ugly creepy image with a black background if it's a transparent GIF or PNG with alpha, however it works perfectly for jpg and normal png.
function cropImage($nw, $nh, $source, $stype, $dest) {
$size = getimagesize($source);
$w = $size[0];
$h = $size[1];
switch($stype) {
case 'gif':
$simg = imagecreatefromgif($source);
break;
case 'jpg':
$simg = imagecreatefromjpeg($source);
break;
case 'png':
$simg = imagecreatefrompng($source);
break;
}
$dimg = imagecreatetruecolor($nw, $nh);
switch ($stype)
{
case "png":
imagealphablending( $dimg, false );
imagesavealpha( $dimg, true );
$transparent = imagecolorallocatealpha($dimg, 255, 255, 255, 127);
imagefilledrectangle($dimg, 0, 0, $nw, $nh, $transparent);
break;
case "gif":
// integer representation of the color black (rgb: 0,0,0)
$background = imagecolorallocate($simg, 0, 0, 0);
// removing the black from the placeholder
imagecolortransparent($simg, $background);
break;
}
$wm = $w/$nw;
$hm = $h/$nh;
$h_height = $nh/2;
$w_height = $nw/2;
if($w> $h) {
$adjusted_width = $w / $hm;
$half_width = $adjusted_width / 2;
$int_width = $half_width - $w_height;
imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
} elseif(($w <$h) || ($w == $h)) {
$adjusted_height = $h / $wm;
$half_height = $adjusted_height / 2;
$int_height = $half_height - $h_height;
imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
} else {
imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
}
imagejpeg($dimg,$dest,100);
}
示例: cropImage(300,200 ,original.png,png,new.png);
我使用php 5.3.2和GD捆绑的库(2.0.34兼容)
I use php 5.3.2 and the GD library bundled (2.0.34 compatible)
如何使其支持透明度?我添加了 imagealphablending()
和 imagesavealpha
但它没有用。或者atlast是否有类似的好类?
How to make it support transparency? i've added imagealphablending()
and imagesavealpha
but it didn't work. Or atlast is there any similar good classes?
谢谢
推荐答案
如果将图像输出到png,丑陋的黑色背景会消失。所以这里有两个替代解决方案,都经过测试:
The ugly black background disappears if you output the image to png. So here are the two alternative solutions, both tested:
-
如果您可以将缩略图存储为png,只需执行以下操作:更改
imagejpeg($ dimg,$ dest,100);
到imagepng($ dimg,$ dest);
如果将它存储为jpeg很重要,请删除行 imagealphablending($ dimg,false);
和 imagesavealpha($ dimg,true);
- 默认值 true
和 false
分别会提供所需的效果。仅当结果图像也具有Alpha通道时,禁用Alpha混合才有意义。
If it's important to store it as jpeg, remove the lines imagealphablending( $dimg, false );
and imagesavealpha( $dimg, true );
-- the default values of true
and false
, respectively, will provide the desired effect. Disabling alpha blending only makes sense if the result image also has an alpha channel.
这篇关于如何改进我的PHP图像缩放器,以支持alpha png和透明GIF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!