我使用此功能来调整图像的大小,但如果它是带有alpha的透明GIF或PNG,我最终会看到带有黑色背景的丑陋令人毛骨悚然的图像,但它适用于jpg和普通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兼容)
如何使其支持透明度?我添加了imagealphablending()
和imagesavealpha
但它没有用。或者还有类似的优秀课程吗?
由于
答案 0 :(得分:1)
如果将图像输出到png,丑陋的黑色背景会消失。所以这两个替代解决方案都经过测试:
如果您可以将缩略图存储为png,只需执行此操作:将imagejpeg($dimg,$dest,100);
更改为imagepng($dimg,$dest);
如果将其存储为jpeg非常重要,请删除行imagealphablending( $dimg, false );
和imagesavealpha( $dimg, true );
- 默认值分别为true
和false
提供所需的效果。仅当结果图像还具有Alpha通道时,禁用Alpha混合才有意义。
答案 1 :(得分:0)
我自己没有测试过,但这是我在处理我的项目时所做的一个想法。
首先,找到一个未在图像中使用的颜色并创建一个新图像,将其作为背景(例如,真的是华丽的绿色,就像他们对动作捕捉一样)
接下来,复制你的图像透明(我知道这适用于我曾经这样做以将边框放在图像上)
然后,使用函数imagecolortransparent定义该图像中的哪种颜色是透明的,并赋予它华丽的绿色。
我认为它会起作用,但我还没有测试过。