如何改进我的 php 图像调整器以支持 alpha png 和透明 GIF
Posted
技术标签:
【中文标题】如何改进我的 php 图像调整器以支持 alpha png 和透明 GIF【英文标题】:How to Improve my php image resizer to support alpha png and transparent GIFs 【发布时间】:2010-04-30 21:44:39 【问题描述】:我使用此功能调整图像大小,但如果它是透明 GIF 或带 alpha 的 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
,但它没有用。或者atlast有没有类似的好课?
谢谢
【问题讨论】:
【参考方案1】:如果您将图像输出为 png,丑陋的黑色背景会消失。所以这里有两个替代解决方案,都经过测试:
如果您可以将缩略图存储为 png,就这样做:将 imagejpeg($dimg,$dest,100);
更改为 imagepng($dimg,$dest);
【讨论】:
【参考方案2】:我自己没有测试过,但这是我在处理我的项目时的一个想法。
首先,找到图像中未使用的颜色,然后创建一个新图像,并以此为背景(例如非常闪亮的绿色,就像他们在动作捕捉中所做的那样)
接下来,复制带有透明度的图像(我知道这适用于 PHP,我曾经这样做是为了在图像上添加边框)
然后,使用函数 imagecolortransparent 来定义该图像中的哪种颜色是透明的,并赋予它华丽的绿色。
我认为它会起作用,但我还没有测试过。
【讨论】:
以上是关于如何改进我的 php 图像调整器以支持 alpha png 和透明 GIF的主要内容,如果未能解决你的问题,请参考以下文章
如何在不改变文本透明度的情况下为 UILabel 设置背景图像并调整其 alpha?