如何改进我的PHP图像缩放器,以支持alpha png和透明GIF

时间:2010-04-30 21:44:40

标签: php image image-manipulation gd

我使用此功能来调整图像的大小,但如果它是带有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但它没有用。或者还有类似的优秀课程吗?

由于

2 个答案:

答案 0 :(得分:1)

如果将图像输出到png,丑陋的黑色背景会消失。所以这两个替代解决方案都经过测试:

  1. 如果您可以将缩略图存储为png,只需执行此操作:将imagejpeg($dimg,$dest,100);更改为imagepng($dimg,$dest);

  2. 如果将其存储为jpeg非常重要,请删除行imagealphablending( $dimg, false );imagesavealpha( $dimg, true ); - 默认值分别为truefalse提供所需的效果。仅当结果图像还具有Alpha通道时,禁用Alpha混合才有意义。

答案 1 :(得分:0)

我自己没有测试过,但这是我在处理我的项目时所做的一个想法。

首先,找到一个未在图像中使用的颜色并创建一个新图像,将其作为背景(例如,真的是华丽的绿色,就像他们对动作捕捉一样)

接下来,复制你的图像透明(我知道这适用于我曾经这样做以将边框放在图像上)

然后,使用函数imagecolortransparent定义该图像中的哪种颜色是透明的,并赋予它华丽的绿色。

我认为它会起作用,但我还没有测试过。