如何改进我的 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);

    1234563仅当结果图像也具有 Alpha 通道时,禁用 Alpha 混合才有意义。

【讨论】:

【参考方案2】:

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

首先,找到图像中未使用的颜色,然后创建一个新图像,并以此为背景(例如非常闪亮的绿色,就像他们在动作捕捉中所做的那样)

接下来,复制带有透明度的图像(我知道这适用于 PHP,我曾经这样做是为了在图像上添加边框)

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

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

【讨论】:

以上是关于如何改进我的 php 图像调整器以支持 alpha png 和透明 GIF的主要内容,如果未能解决你的问题,请参考以下文章

如何在不改变文本透明度的情况下为 UILabel 设置背景图像并调整其 alpha?

调整大小后通过鼠标连续调整其余图像的大小,并保持比例

ALPHA通道如何给图像添加阴影效果??

使用 FPDF (PHP) 插入带有 alpha 通道的 PNG

如何调整html中的图像大小以适应屏幕尺寸?

使用 UIScrollView 更改图像的 alpha