web-dev-qa-db-fra.com

imagecreatefrompng () Fait un fond noir au lieu de transparent?

Je crée des vignettes à l'aide de PHP et de la bibliothèque Gd mais mon code transforme la transparence du png en une couleur noire unie. Existe-t-il une solution pour améliorer mon code?

c'est mon code fabricant de vignettes 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);
}

Je vous remercie

38
Emily

Après 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;

// ...
75
Adrian

L'ordre des opérations est important. pour les images .gif, j’ai trouvé qu’il me fallait d’abord copier l’image redimensionnée, puis attribuer le fond noir comme transparent. pour les fichiers PNG, j'ai trouvé le code ci-dessous qui redimensionnait les images et conservais les fonds de transparence.

aussi, ce code a fonctionné pour moi ...

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

si le code de la bonne réponse ne fonctionne pas, essayez ceci:

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

Parfois, si l’image .jpg comportait de petites erreurs (vous ne pouvez pas le voir), tous les pixels transparents deviennent noirs. Essayez d’utiliser: 

ini_set('Gd.jpeg_ignore_warning', 1);
3
Stone

Voici mon code de test total. Ça marche pour moi

$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);
3
Md. Imadul Islam

Une partie de ce qui précède fait que les parties noires de l'image deviennent blanches, alors que d'autres ne fonctionnent pas du tout. Cela a cependant fonctionné pour moi https://github.com/claviska/SimpleImage/issues/28

0
Aba

changez rgb en 255, cela vous donnera une image transparente, plutôt que noire.

<?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;
}
?>
0
Basit