112 votes

La transparence des images PNG peut-elle être préservée lors de l'utilisation de la GDlib imagecopyresampled de PHP ?

L'extrait de code PHP suivant utilise GD pour redimensionner un PNG téléchargé par le navigateur en 128x128. Cela fonctionne très bien, sauf que les zones transparentes de l'image originale sont remplacées par une couleur unie, le noir dans mon cas.

Même si imagesavealpha est réglé, quelque chose ne va pas.

Quelle est la meilleure façon de préserver la transparence dans l'image rééchantillonnée ?

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );    
imagesavealpha( $targetImage, true );

$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

4voto

Linus Unnebäck Points 1855

Je suppose que cela pourrait faire l'affaire :

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );

$targetImage = imagecreatetruecolor( 128, 128 );

$transparent = imagecolorallocate($targetImage,0,255,0);
imagecolortransparent($targetImage,$transparent);
imagefilledrectangle($targetImage,0,0,127,127,$transparent);

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

L'inconvénient est que l'image sera dépourvue de tous les pixels verts à 100%. Quoi qu'il en soit, j'espère que cela vous aidera :)

1voto

Kalle Points 11

En ce qui concerne la préservation de la transparence, oui, comme indiqué dans d'autres messages, imagesavealpha() doit être réglé sur true, pour utiliser le drapeau alpha, imagealphablending() doit être réglé sur false, sinon cela ne fonctionne pas.

J'ai également remarqué deux petites choses dans votre code :

  1. Vous n'avez pas besoin d'appeler getimagesize() pour obtenir la largeur/hauteur de imagecopyresmapled()
  2. El $uploadWidth y $uploadHeight devrait être -1 la valeur, puisque les cordonnées commencent à 0 et non 1 afin de les copier dans un pixel vide. En le remplaçant par : imagesx($targetImage) - 1 y imagesy($targetImage) - 1 Relativement, cela devrait suffire :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X