imagecreatefrompng()使背景变成黑色而不是透明?

我使用PHP和GD库制作缩略图,但是我的代码将png透明度变成了纯黑色,是否有解决方案来改进我的代码?


这是我的PHP缩略图制作者代码:


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

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

}

谢谢


长风秋雁
浏览 1730回答 3
3回答

慕田峪4524236

在imagecreatetruecolor()之后:<?php// ... Before imagecreatetruecolor()$dimg = imagecreatetruecolor($width_new, $height_new); // png ?: gif// start changesswitch ($stype) {&nbsp; &nbsp; case 'gif':&nbsp; &nbsp; case 'png':&nbsp; &nbsp; &nbsp; &nbsp; // integer representation of the color black (rgb: 0,0,0)&nbsp; &nbsp; &nbsp; &nbsp; $background = imagecolorallocate($dimg , 0, 0, 0);&nbsp; &nbsp; &nbsp; &nbsp; // removing the black from the placeholder&nbsp; &nbsp; &nbsp; &nbsp; imagecolortransparent($dimg, $background);&nbsp; &nbsp; &nbsp; &nbsp; // turning off alpha blending (to ensure alpha channel information&nbsp; &nbsp; &nbsp; &nbsp; // is preserved, rather than removed (blending with the rest of the&nbsp; &nbsp; &nbsp; &nbsp; // image in the form of black))&nbsp; &nbsp; &nbsp; &nbsp; imagealphablending($dimg, false);&nbsp; &nbsp; &nbsp; &nbsp; // turning on alpha channel information saving (to ensure the full range&nbsp; &nbsp; &nbsp; &nbsp; // of transparency is preserved)&nbsp; &nbsp; &nbsp; &nbsp; imagesavealpha($dimg, true);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; break;}// end changes$wm = $w/$nw;$hm = $h/$nh;// ...

婷婷同学_

操作顺序很重要。对于.gif图像,我发现我需要首先复制调整大小的图像,然后将黑色背景指定为透明背景。对于PNG,我在下面的代码中调整了图像的大小,并保留了透明背景。而且,这段代码对我有用...$resized_image = imagecreatetruecolor($target_width, $target_height);switch ( $asset->a_mime_type ){&nbsp; &nbsp; case 'image/jpeg':&nbsp; &nbsp; &nbsp; &nbsp; imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height);&nbsp; &nbsp; &nbsp; &nbsp; $r = imagejpeg($resized_image,$file_name);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case 'image/png':&nbsp; &nbsp; &nbsp; &nbsp; imagealphablending($resized_image, FALSE);&nbsp; &nbsp; &nbsp; &nbsp; imagesavealpha($resized_image, TRUE);&nbsp; &nbsp; &nbsp; &nbsp; imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height);&nbsp; &nbsp; &nbsp; &nbsp; $r = @imagepng($resized_image,$file_name);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case 'image/gif':&nbsp; &nbsp; &nbsp; &nbsp; imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height);&nbsp; &nbsp; &nbsp; &nbsp; $background = imagecolorallocate($resized_image, 0, 0, 0);&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; imagecolortransparent($resized_image, $background);&nbsp; &nbsp; &nbsp; &nbsp; $r = @imagegif($resized_image,$file_name);&nbsp; &nbsp; &nbsp; &nbsp; break;}

守候你守候我

这是我的总测试代码。这个对我有用$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);$filename = 'test.' . $imageFileType;move_uploaded_file($_FILES["image"]["tmp_name"], $filename);$source_image = imagecreatefromjpeg($filename);$source_imagex = imagesx($source_image);$source_imagey = imagesy($source_image);$dest_imagex = 400;$dest_imagey = 600;$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);imagesavealpha($dest_image, true);$trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127);imagefill($dest_image, 0, 0, $trans_colour);imagepng($dest_image,"test1.png",1);
打开App,查看更多内容
随时随地看视频慕课网APP