How to Improve my php image resizer to support alpha png and transparent GIFs

喜你入骨 提交于 2019-12-21 23:30:45

问题


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);
     }

Example : cropImage("300","200","original.png","png","new.png");

I use php 5.3.2 and the GD library bundled (2.0.34 compatible)

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?

Thanks


回答1:


The ugly black background disappears if you output the image to png. So here are the two alternative solutions, both tested:

  1. If you can store the thumbnail as png, just do it: change imagejpeg($dimg,$dest,100); to imagepng($dimg,$dest);

  2. 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.




回答2:


I haven't tested it myself but this was an idea I've had for doing exactly that when working on a project of mine.

First, find a color that isn't used in the image and create a new image with that as the background (really flashy green for example, just like they do with motion capture)

Next, copy your image with transparency over it (I know this works with PHP I used to do this to put borders over images)

Then, use the function imagecolortransparent to define which color in that image is transparent and give it your flashy green color.

I think it would work but I haven't tested it.



来源:https://stackoverflow.com/questions/2747888/how-to-improve-my-php-image-resizer-to-support-alpha-png-and-transparent-gifs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!