Aller au contenu

[RESOLU] PHP GD et watermark transparent


Messages recommandés

Saloute amis INpactiens !

Pour un premier topic sur PCI, je demande déjà de l'aide :chinois:

Voilà le topo. En gros je souhaite simplement ajouter des watermark à des images. Je sais, dis comme ça, ça a l'air très con, mais voilà comment ça se passe pour l'instant.

- sur une image jpg, le watermark se met très bien, il est transparent

- sur une image png en laissant l'alpha blending, ça marche très bien aussi (sauf que du coup, on perd la possible transparence de l'image d'origine)

- sur une image png en gardant la valeur alpha, le watermark n'est plus transparent mais l'image d'origine oui...

:fumer:

Alors, si vous avez un apache sous la main, voilà les fichiers pour tester:

http://www.axel-binda.com/pci/img.png

http://www.axel-binda.com/pci/img.jpg

http://www.axel-binda.com/pci/wm.png

Et wala les deux pages qui vont vous servir à tester

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>

<style type="text/css">
body{
	background : #f1f1f1;
}
</style>

</head>
<body>
<img alt="gd generated" src="gd.php?<?php echo date("His",time()); ?>">
</body>
</html>

gd.php

<?php
# create the img resources
$img 	= imagecreatefrompng('img.png');
$jpg 	= imagecreatefromjpeg('img.jpg');
$wm		= imagecreatefrompng('wm.png');


# create a new image
$final 	= imagecreatetruecolor(400,400);

# set the alpha settings for the background image
//imagealphablending($final,false);
//imagesavealpha($final,true);

# set the alpha settings for the watermark
imagealphablending($wm,false);
imagesavealpha($wm,true);

# create the final image
# add the PNG background image
imagecopyresampled($final,$img,0,0,0,0,400,400,400,400);
# add the JPG background image
//imagecopyresampled($final,$jpg,0,0,0,0,400,400,400,400);


# add the watermark
imagecopyresampled($final,$wm,20,20,0,0,100,100,100,100);


# dump the final image
header("Content-type: image/png");
return imagepng($final);
?>

C'est le minimum syndical dans mon cas. En fait, je pense que GD s'emmêle les pinceaux dès qu'on lui demande de gérer deux image transparentes à la fois. Ptètre que c'est une limitation de la librairie, je sais pas trop mais c'est aussi pour ça que je poste ici :transpi:

Si quelqu'un a une idée, je suis preneur.

Lien vers le commentaire
Partager sur d’autres sites

C'est un sujet qui fâche les watermark ? :pleure:

Bon j'ai continué à creuser un peu plus le pourquoi du comment et j'en suis venu à cette déduction. En fait, le watermark n'est pas rempli avec une couleur mais il est bien transparent. Le problème est lorsque je copie le watermark dans le PNG d'origine c'est comme si je faisais un trou dedans et que je calais le watermark dedans.

Mais je veux pas ça :francais: Et puis je comprends toujours pas pourquoi ça réagit pas pareil avec les JPG...

Toujours pas d'idées ? :p

Lien vers le commentaire
Partager sur d’autres sites

Bon ben j'ai finalement trouvé la solution qui traînait dans les bas-fonds d'un forum ou de je sais plus où exactement, mais je mets la solution ici, ça pourra peut-être servir à quelqu'un d'autre qui sait :mdr:

# if the base picture is already a PNG, we have to apply some extra processes
if($this->extension == 'png'){			
# remove the alpha blending
imagealphablending($this->image, false);
# set the transparent color
$transparent = imagecolorallocatealpha($this->image, 0, 0, 0, 127);
imagefill($this->image, 0, 0, $transparent);
# set the transparency settings for the picture after adding the transparency
imagesavealpha($this->image,true);
imagealphablending($this->image, true);
}

Voilà, en fait ça consiste à faire un savant mélange des propriétés alpha d'une image PNG dans un ordre bien défini sinon ça marche plus :craint: Merci pour l'inspiration divine du type qui a trouvé ça :D

Lien vers le commentaire
Partager sur d’autres sites

De rien ;)

En fait, vu le temps que j'ai passé dessus à me prendre le chou, je me suis dit que ça pourrait vraiment servir à quelqu'un d'autre. Pi à moi aussi vu que j'ai une mémoire de poisson rouge :transpi:

En tout cas ouais, le bout de code que j'ai mis en solution est à appliquer à l'image principale juste avant de lui coller le watermark dessus.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...