Peut de la transparence des images PNG être préservé lors de l'utilisation de PHP GDlib imagecopyresampled?
Le code PHP suivant extrait de code utilise GD pour redimensionner un navigateur téléchargé PNG de 128x128 pixels. Il fonctionne très bien, sauf que les zones transparentes de l'image d'origine sont remplacés par un solide de couleur noire dans mon cas.
Même si imagesavealpha
est défini, quelque chose n'est pas tout à fait droit.
Quel est le meilleur moyen de préserver la transparence dans l'échantillonnage de l'image?
$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 );
Vous devez vous connecter pour publier un commentaire.
a fait pour moi. Grâce ceejayoz.
remarque, l'image de la cible a besoin de l'alpha paramètres, et non la source de l'image.
Edit:
le remplacement complet de code. Voir aussi les réponses ci-dessous et leurs commentaires. Ce n'est pas garanti d'être parfait, mais n'a atteindre mes besoins du moment.
alphablending = false
important ici? La doc états... "Vous devez annuler la transparence (imagealphablending($im, false)
), pour l'utiliser."imagecreatefrompng()
suggère queimagealphablending
doit être définietrue
, ce qui est manifestement erroné. Grâce muchly.Pourquoi avez-vous rendre les choses si compliquées? ce qui suit est ce que j'utilise et pour l'instant il a fait le travail pour moi.
Je crois que cela devrait faire l'affaire:
edit: Quelqu'un dans le PHP docs revendications
imagealphablending
doit être vrai, de faux pas. YMMV.imagealphablending
soit par vrai ou faux, je reçois toujours un arrière-plan noir.Un ajout qui pourrait aider certaines personnes:
Il est possible de changer imagealphablending alors que la construction de l'image. J'ai le cas particulier que j'avais besoin de cela, je voulais combiner certaines de ces semi-transparent PNG sur fond transparent.
D'abord, vous définissez imagealphablending de faux et de remplir le nouvellement créé de véritable couleur de l'image avec une couleur transparente. Si imagealphablending était vrai, il ne se passe rien parce que le fond transparent de fusionner avec le noir en arrière-plan par défaut et le résultat dans le noir.
Puis vous mettez de imagealphablending de vrai et ajouter quelques images PNG à la toile, laissant un peu de l'arrière-plan visible (c'est à dire. ne pas remplir la totalité de l'image).
Le résultat est une image avec un fond transparent et plusieurs combinés des images PNG.
J'ai fait une fonction de redimensionnement d'image comme JPEG, GIF, PNG, avec
copyimageresample
et PNG images toujours garder la transparence:$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é de tous 100% de pixels verts. En tout cas, espérons que cela aide 🙂
imagecreate(...)
fonctionné bien. Vous créez une image, qui est rempli avec la première couleur que vous allouer. Ensuite, vous pouvez définir cette couleur transparente. Si la transparence est définie sur true pour l'image de la cible, les deux images seront fusionnées et la transparence fonctionne correctement.Reclassement de la préserver la transparence, alors oui, comme dit dans d'autres posts imagesavealpha() doivent être mis à true, l'utilisation de l'alpha drapeau imagealphablending() doit être définie sur false sinon cela ne fonctionne pas.
Aussi j'ai repéré deux petites choses dans votre code:
getimagesize()
pour obtenir la largeur/hauteur deimagecopyresmapled()
$uploadWidth
et$uploadHeight
devrait être-1
la valeur, depuis la cordinates commence à0
et pas1
, de sorte qu'il serait de les copier dans un vide pixel. Le remplaçant par:imagesx($targetImage) - 1
etimagesy($targetImage) - 1
, relativily devrait le faire 🙂Voici mon code de test. Il fonctionne pour moi
Prêter attention à la source de l'image
width
etheight
valeurs qui sont passés àimagecopyresampled
fonction. Si ils sont plus grand que la source réelle de la taille d'image, le reste de la zone de l'image sera rempli avec la couleur noire.J'ai combiné les réponses de ceejayoz et Cheekysoft, qui a donné le meilleur résultat pour moi. Sans imagealphablending() et imagesavealpha() l'image n'est pas claire: