Transparence PNG avec PHP
vous avez du mal à maintenir la transparence sur un png quand je crée une vignette à partir de celui-ci, quelqu'un d'expérience avec cela? toute aide serait super, voici ce que je fais actuellement:
$fileName= "../js/ajaxupload/tees/".$fileName;
list($width, $height) = getimagesize($fileName);
$newwidth = 257;
$newheight = 197;
$thumb = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($thumb, true);
$source = imagecreatefrompng($fileName);
imagealphablending($source, true);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagesavealpha($thumb, true);
imagepng($thumb,$newFilename);
5 réponses
j'ai eu du succès en faisant comme ça dans le passé:
$thumb = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
$source = imagecreatefrompng($fileName);
imagealphablending($source, true);
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagepng($thumb,$newFilename);
j'ai trouvé la qualité d'image de sortie beaucoup mieux en utilisant imagecopyresampled()
que imagecopyresized()
oubliez l'indice de transparence des couleurs, il ne fonctionne jamais dans tous les produits de rendu. Utilisez plutôt un masque de couche alpha:
$image = imagecreatetruecolor($size, $size);
imagealphablending($image, false);
imagesavealpha($image, true);
$trans_layer_overlay = imagecolorallocatealpha($image, 220, 220, 220, 127);
imagefill($image, 0, 0, $trans_layer_overlay);
imagecopyresized ne supporte pas la transparence correctement.
imagecopymerge fait, mais il ne redimensionne pas.
la solution? Vous finiriez probablement par redimensionner la chose manuellement.
ces fonctions accèdent à la bibliothèque gdlib sous-jacente, qui est un beau jouet, mais pas quelque chose qui rend de beaux résultats. Si vous avez l'option, Utilisez imagemagick à la place. L'inconvénient est qu'il n'y a actuellement pas de bonnes liaisons php, donc vous devez y accéder via le shell, ce qui n'est généralement pas autorisé sur les hôtes partagés.
Voir dycey, la réponse à "Comment puis-je redimensionner..." . Essentiellement, vous devez remplir le fond entier avec transparence avant de faire toute autre opération.