本文介绍了如何改进我的PHP图像缩放器,以支持alpha png和透明GIF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

我使用此功能来调整图像大小,但如果它是带有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:


  1. 如果您可以将缩略图存储为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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 15:20