L'extrait de code PHP suivant utilise GD pour redimensionner un PNG téléchargé par navigateur en 128x128. Cela fonctionne très bien, sauf que les zones transparentes de l'image d'origine sont remplacées par une couleur unie - noir dans mon cas.
Même si imagesavealpha
c'est réglé, quelque chose ne va pas.
Quelle est la meilleure façon de préserver la transparence de 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 );
alphablending = false
important ici? Le document l'indique ... "Vous devez désactiver alphablending (imagealphablending($im, false)
), pour l'utiliser."imagecreatefrompng()
suggère qu'ilimagealphablending
faut définirtrue
, ce qui est clairement faux. Merci beaucoup.Pourquoi compliquez-vous les choses? ce qui suit est ce que j'utilise et jusqu'à présent, il a fait le travail pour moi.
la source
Je pense que cela devrait faire l'affaire:
edit: Quelqu'un dans les revendications de la documentation PHP
imagealphablending
devrait être vrai, pas faux. YMMV.la source
imagealphablending
soit vrai ou faux, j'obtiens toujours un fond noir.Un ajout qui pourrait aider certaines personnes:
Il est possible de basculer imagealphablending lors de la création de l'image. Dans le cas précis où j'en avais besoin, je voulais combiner des PNG semi-transparents sur un fond transparent.
Commencez par définir imagealphablending sur false et remplissez la nouvelle image en couleur vraie avec une couleur transparente. Si imagealphablending était vrai, rien ne se passerait car le remplissage transparent fusionnerait avec l'arrière-plan noir par défaut et donnerait du noir.
Ensuite, vous basculez imagealphablending sur true et ajoutez des images PNG au canevas, laissant une partie de l'arrière-plan visible (c'est-à-dire ne remplissant pas l'image entière).
Le résultat est une image avec un fond transparent et plusieurs images PNG combinées.
la source
J'ai créé une fonction pour redimensionner l'image comme JPEG / GIF / PNG avec
copyimageresample
et les images PNG y conservent toujours la transparence:la source
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
Je suppose que cela pourrait faire l'affaire:
L'inconvénient est que l'image sera dépouillée de tous les 100% de pixels verts. Quoi qu'il en soit, j'espère que cela aide :)
la source
imagecreate(...)
fonctionné cependant. Vous créez une image qui est remplie avec la première couleur que vous attribuez. Ensuite, vous définissez cette couleur sur transparent. Si alphablending est défini sur true pour l'image cible, les deux images seront fusionnées et la transparence fonctionnera correctement.En reclassant la transparence de conservation, alors oui comme indiqué dans d'autres articles, imagesavealpha () doivent être définis sur true, pour utiliser l'indicateur alpha, imagealphablending () doit être défini sur false sinon cela ne fonctionne pas.
J'ai également repéré deux choses mineures dans votre code:
getimagesize()
pour obtenir la largeur / hauteur deimagecopyresmapled()
$uploadWidth
et$uploadHeight
devrait être-1
la valeur, puisque les coordonnées commencent à0
et non1
, donc il les copierait dans un pixel vide. Le remplacer par:imagesx($targetImage) - 1
etimagesy($targetImage) - 1
, relativement devrait faire :)la source
Voici mon code de test total. Ça marche pour moi
la source
Faites attention à l'image source
width
et auxheight
valeurs transmises à laimagecopyresampled
fonction. S'ils sont plus grands que la taille réelle de l'image source, le reste de la zone d'image sera rempli de couleur noire.la source
J'ai combiné les réponses de ceejayoz et Cheekysoft, ce qui a donné le meilleur résultat pour moi. Sans imagealphablending () et imagesavealpha (), l'image n'est pas claire:
la source