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

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

这是我的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); } 

谢谢

imagecreatetruecolor()之后:

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

操作顺序很重要。 对于.gif图像我发现我需要先复制resize的图像,然后将黑色背景分配为透明。 对于PNG,我发现下面的代码resize的图像,并保持透明背景。

此外,这段代码为我工作…

 $resized_image = imagecreatetruecolor($target_width, $target_height); switch ( $asset->a_mime_type ) { case 'image/jpeg': imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); $r = imagejpeg($resized_image,$file_name); break; case 'image/png': imagealphablending($resized_image, FALSE); imagesavealpha($resized_image, TRUE); imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); $r = @imagepng($resized_image,$file_name); break; case 'image/gif': imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); $background = imagecolorallocate($resized_image, 0, 0, 0); imagecolortransparent($resized_image, $background); $r = @imagegif($resized_image,$file_name); break; } 

有时如果.jpg图像里面有小错误(你看不到),所有的透明像素变成黑色。尝试使用:

 ini_set('gd.jpeg_ignore_warning', 1); 

如果正确答案的代码不起作用,请尝试以下操作:

  //After imagecreatetruecolor(): $white = imagecolorallocate($dimg, 255, 255, 255); imagefill($dimg,0,0,$white); 

这是我的总testing代码。 它适用于我

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

改变rgb为255,它会给你透明的图像,而不是黑色。

 <?php switch ($stype) { case "png": // integer representation of the color black (rgb: 0,0,0) $background = imagecolorallocate($simage, 255, 255, 255); // removing the black from the placeholder imagecolortransparent($simage, $background); // turning off alpha blending (to ensure alpha channel information is preserved, rather than removed (blending with the rest of the image in the form of black)) imagealphablending($simage, false); // turning on alpha channel information saving (to ensure the full range of transparency is preserved) imagesavealpha($simage, true); break; case "gif": // integer representation of the color black (rgb: 0,0,0) $background = imagecolorallocate($simage, 255, 255, 255); // removing the black from the placeholder imagecolortransparent($simage, $background); break; } ?>