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

спасибо

7 ответов


после 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);

        // 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-изображения я обнаружил, что мне нужно сначала скопировать измененное изображение, а затем назначить черный фон прозрачным. для PNGs я нашел код ниже измененных размеров изображений и сохранил фон прозрачности.

также, этот код работал для меня...

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

если код правильного ответа не работает, попробуйте этот :

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

иногда, если .изображение jpg получило небольшие ошибки внутри (вы этого не видите), все прозрачные пиксели становятся черными.Попробуйте использовать:

ini_set('gd.jpeg_ignore_warning', 1);

вот мой тест код. Это работает для меня

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

некоторые из вышеперечисленных сделали черные части изображения белыми, в то время как некоторые не работали вообще. Это, однако, сработало для меня https://github.com/claviska/SimpleImage/issues/28