Php imagecreatefrompng()制作黑色背景而不是透明背景?

Php imagecreatefrompng()制作黑色背景而不是透明背景?,php,gd,thumbnails,Php,Gd,Thumbnails,我使用PHP和GD库制作缩略图,但我的代码将png透明度转换为纯黑色,有没有改进代码的解决方案 这是我的php缩略图生成器代码: function cropImage($nw, $nh, $source, $stype, $dest) { $size = getimagesize($source); $w = $size[0]; $h = $size[1]; switch($stype) { case 'gif':

我使用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);
}
函数cropImage($nw、$nh、$source、$stype、$dest){
$size=getimagesize($source);
$w=$size[0];
$h=$size[1];
交换机($stype){
案例“gif”:
$simg=imagecreatefromformgif($source);
打破
案件‘jpg’:
$simg=imagecreatefromjpeg($source);
打破
案例“png”:
$simg=imagecreatefrompng($source);
打破
}
$dimg=ImageCreateTureColor($nw,$nh);
$wm=$w/$nw;
$hm=$h/$nh;
$h_高度=$nh/2;
$w_高度=$nw/2;
如果($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在ImageCreateTureColor()之后):


有时,如果.jpg图像内部出现小错误(你看不到),所有透明像素都会变成黑色。请尝试使用:

ini_set('gd.jpeg_ignore_warning', 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;
}
?>

如果正确答案的代码无效,请尝试以下操作:

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

操作顺序很重要。对于.gif图像,我发现我需要先复制调整大小的图像,然后将黑色背景指定为透明。对于PNG,我在调整大小的图像下面找到了代码,并保留了透明背景

而且,这个代码对我很有用

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

这是我的全部测试代码。它适合我

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

上面的一些操作使图像的黑色部分变为白色,而有些则根本不起作用。但是,这对我来说是有效的,只需添加以下行:

imagesavealpha($image, true);
以前

imagepng($image)

只是想澄清一下,在上面的代码中,
$simage
imagecreatetruecolor
的输出为我的png工作,但GIF仍然有黑色背景;也不理解第二个案例“png”语句的值。这是必要的吗?我尝试了使用和不使用,并没有发现任何区别。将近9年后,同样的问题出现了仍然在这里…上面的解决方案没有帮助..还有其他建议吗?对于一些图像,你需要先用透明的填充背景,奇怪,但有效
imagepng($image)