web-dev-qa-db-fra.com

Transparence PNG avec PHP

Hé avoir du mal à essayer de maintenir la transparence sur un png lorsque j'en crée une miniature, quelqu'un a-t-il une expérience avec cela? toute aide serait formidable, 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);
43
BastardPrince

J'ai réussi à le faire 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 bien meilleure en utilisant imagecopyresampled() que imagecopyresized()

82
Tom Haigh

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);
13
user629089

imagecopyresized ne prend pas correctement en charge la transparence.

imagecopymerge le fait, mais il ne redimensionne pas.

La solution? Vous finiriez probablement par redimensionner la chose manuellement.

2
strager

Ces fonctions accèdent à la bibliothèque gdlib sous-jacente, qui est un beau jouet, mais pas quelque chose qui donne de bons résultats. Si vous avez l'option, utilisez plutôt imagemagick . L'inconvénient est qu'il n'y a actuellement pas de bonnes liaisons php, vous devez donc y accéder via le shell, ce qui n'est généralement pas autorisé sur les hôtes partagés.

2
troelskn

Voir réponse de Dycey à "Comment puis-je redimensionner ..." . Essentiellement, vous devez remplir tout l'arrière-plan de transparence avant de faire toute autre opération.

1
Paul Fisher