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);
43
demandé sur BastardPrince 2008-11-24 01:59:06

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()

82
répondu Tom Haigh 2008-11-23 23:23:17

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
répondu user629089 2011-02-22 20:59:10

imagecopyresized ne supporte pas la transparence correctement.

imagecopymerge fait, mais il ne redimensionne pas.

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

2
répondu strager 2008-11-23 23:12:26

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.

2
répondu troelskn 2008-11-23 23:32:41

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.

1
répondu Paul Fisher 2017-05-23 12:10:43