Transparence pour superposition et changement de couleur

Transparence pour superposition et changement de couleur - PHP - Programmation

Marsh Posté le 29-10-2005 à 19:02:32    

Salut tous!
Bon alors mon problème se situe au niveau de la création d'images, mais vu le titre je pense que c'est évident. Bref voici mon problème :
 
J'ais deux images, disons 1.gif et 2.gif de 100px * 100px chacune. Mon but est de les spperposer en utilisant une transparence définie à partir d'une couleur. Bon je sais c'est pas clair mais voici ce que ca donne :
 

Code :
  1. <?
  2. // Définitions des images à utiliser
  3. $image1 = "1.gif";
  4. $image2 = "2.gif";
  5. // Header type image/gif
  6. header ("Content-type: image/gif" );
  7. // Création de l'image 100px * 100px
  8. $im = ImageCreate (100, 100);
  9. // Création des couleurs
  10. $col_lignes = ImageColorAllocate ($im, 0, 0, 0);
  11. $col_texte = ImageColorAllocate ($im, 0, 0, 0);
  12. $transparent = ImageColorAllocate ($im, 255, 255, 255);
  13. // Définition de la couleur de transparence
  14. ImageColorTransparent ($im, $transparent);
  15. // Copie des images
  16. $res_image1 = ImageCreateFromGif($image1);
  17. $res_image2 = ImageCreateFromGif($image2);
  18. imagecopymerge ( $im, $res_image1, 0, 0, 0, 0, 100, 100, 100 );
  19. imagecopymerge ( $im, $res_image2, 0, 0, 0, 0, 100, 100, 100 );
  20. // Rendu
  21. ImageGif ($im);
  22. imagedestroy($im);
  23. ?>


 
Alors les deux images que j'utilises ont toutes deux un fond blanc.
Donc forcément quand je fait les copies des deux l'une viens surperposer l'autre et la masque.
 
Alors voici ma question :
Y a t il un moyen de faire en sorte que lorsque la copie d'une image se fait qu'une couleur (disons le blanc) soit ignorée, autrement dit qu'elle ne soit pas copiée et ainsi faire comme si mon image 2.gif avait un fond transparent et non pas blanc.
 
En vous remerciant et bonne soiré/journée.


Message édité par dwogsi le 31-10-2005 à 19:06:59

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 29-10-2005 à 19:02:32   

Reply

Marsh Posté le 29-10-2005 à 20:01:41    

en fait ImageColorTransparent() fonctionne qu'avec des truecolor
> Transparency is copied only with imagecopymerge() and true color images, not with imagecopy() or pallete images.
mais il te faut du truecolor :|
et là copies ton $res_image2 dans un nvlle truecolor, définit la couleur transparente et imagecopymerge().
mais en ce cas autant partir sur du png ...

Reply

Marsh Posté le 29-10-2005 à 20:03:37    

Hummm j'avais justement vu pour le imagecopymerge(), mais je n'avais pas vu qu'il fallait une truecolor pour la transparence. En te remerciant, je vais tester ca. :jap:


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 29-10-2005 à 20:11:07    

cadeau :D
 

Code :
  1. <?
  2. // Définitions des images à utiliser
  3. $image1 = "1.gif";
  4. $image2 = "2.gif";
  5.  
  6. // Header type image/gif
  7. header ("Content-type: image/gif" );
  8.  
  9. // Création de l'image 100px * 100px
  10. $im = ImageCreate (100, 100);
  11.  
  12. // Création des couleurs
  13. $col_lignes = ImageColorAllocate ($im, 0, 0, 0);
  14. $col_texte = ImageColorAllocate ($im, 0, 0, 0);
  15. $transparent = ImageColorAllocate ($im, 255, 255, 255);
  16.  
  17. // Définition de la couleur de transparence
  18. //ImageColorTransparent ($im, $transparent);
  19.  
  20. // Copie des images
  21. $res_image1 = ImageCreateFromGif($image1);
  22. $res_image2 = ImageCreateFromGif($image2);
  23.  
  24. // BO PATCH
  25. $temp_im = imagecreatetruecolor (100, 100);
  26. $temp_transparent = ImageColorAllocate ($temp_im, 255, 255, 255);
  27. imagecopymerge ( $temp_im, $res_image2, 0, 0, 0, 0, 100, 100, 100 );
  28. ImageColorTransparent ($temp_im, $temp_transparent);
  29.  
  30. imagecopymerge ( $im, $res_image1, 0, 0, 0, 0, 100, 100, 100 );
  31. imagecopymerge ( $im, $temp_im, 0, 0, 0, 0, 100, 100, 100 );
  32. // EO PATCH
  33.  
  34. // Rendu
  35. ImageGif ($im);
  36. imagedestroy($im);
  37. ?>


 
edit : mais sérieux, part sur du .png, non ?


Message édité par shakpana le 29-10-2005 à 20:11:49
Reply

Marsh Posté le 30-10-2005 à 05:33:47    

Mais ca marche c'est merveilleux merci!!! :jap:


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-10-2005 à 05:45:38    

Pourquoi du png plus que du gif? est ce que ca a une importance dans mon cas ou est ce que tu parle du "cas générale"?


Message édité par dwogsi le 30-10-2005 à 05:45:52

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-10-2005 à 13:10:28    

oui, en fait tu as raison, je ne sais pas vraiment d'où viennent tes images, de ce qu'il a dessus ou si au final tu as besoin d'une image 8 bit, donc p.e. que le png n'a pas d'interêt ppour toi.
Mais ce que tu fais me fait étrangement penser à un système que je viens de mettre en place, un système de thumbnailing multicouches genre background / image / foreground. Et donc le foreground est un png 24 avec un joli dégradé genre couleur vers alpha, ce qui est totalement impossible avec une transparence mono-couleur (merci la couche alpha), et au final j'en sors un .jpg, car j'ai plus besoin de la transparence ;)
De plus, si tu te fais un png foreground de taille raisonnable, le redimensionnement n'impacte pas sur l'aliasing comme sur les images 8 bits, ouala pourquoi du .png ...


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 30-10-2005 à 13:19:39    

Non mais en fait ce sur quoi je trvail est système permettant de "fusionner" des images tout format donc en fait le gif c'était juste pour l'exemple, ce que je fais c'est que je laisse totalement le choix à l'utulisateur qui peu donc choisir ses deux images, mon code en détecte le formet les fusionne et laisse encore le choix à l'utilisateur du format de sortie.

Reply

Marsh Posté le 30-10-2005 à 14:56:51    

Tiens en fait en passant j'en profite pour poser une nouvelle question :
Existe-t-il une fonction qui permet de changer une couleur sur l'image, par exemple de passer tout ce qui est en noir en rouge? Je n'ais rien vu de tel mais je suis peut être passé à côté...

Reply

Marsh Posté le 31-10-2005 à 18:33:06    

dwogsi a écrit :

...changer une couleur sur l'image, par exemple de passer tout ce qui est en noir en rouge...


je dirais que si c'est une image à pallette, rien de plus simple ...  
imagecolorexact() puis imagecolorset()
 
maintenant sur une truecolor, je ne sais pas si c'est possible via GD ...
mais là encore une fois un png 24 avec alpha, et hop  :p
[ edit: mais je sais, ça correpond pas à ton appli ... ]


Message édité par shakpana le 31-10-2005 à 18:34:48

---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 31-10-2005 à 18:33:06   

Reply

Marsh Posté le 31-10-2005 à 18:48:00    

Bah en fait je me suis jamais vraiment intéressé à la création d'images via PHP/GD, sauf pour faire des captcha.. Donc je continue à m'y intéressé pour développé d'autres applis pour mon plaisir personnel. En tout cas merci, je vais tester ça.


Message édité par dwogsi le 31-10-2005 à 18:48:12

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 31-10-2005 à 19:14:56    

Bon et bien ta solution marche à merveille! Merci :jap:
 
Sinon j'arrive toujours pas à rendre une zone transparentes das mon image si par exemple le rendu est en gif, j'ai lu des choses sur les png et les couches alpha mais là je suis complétement largué... Mais je vais me débrouillé tant bien que mal. Encore merci.

Reply

Marsh Posté le 31-10-2005 à 20:05:10    

dwogsi a écrit :

Sinon j'arrive toujours pas à rendre une zone transparentes das mon image si par exemple le rendu est en gif, j'ai lu des choses sur les png et les couches alpha mais là je suis complétement largué...


je suis pas sûr de voir où est ton soucis ?
Tu veux dire de rendre une couleur transparente pour une sortie en gif ?
 
Ci dessous un exemple, en image 8 bits
- ouverture d'un gif 8 bits avec transparence
- création d'une img de destination
- application d'un arrière plan kaki (hmmm...)
- définition de la couleur RGB(119, 123, 180) - le violet du logo - en tant que transparente  
- sortie vers un gif 8 bits
 
et en commenté, la version truecolor/png - m$ie Not Friendly
le résultat est très moche, mais illustre bien le propos  [:coch]  
 

Code :
  1. $im = imagecreatefromgif ( 'http://sk2.php.net/images/php.gif' );
  2. $w = imagesx ( $im );
  3. $h = imagesy ( $im );
  4.  
  5. //$iOut = imagecreatetruecolor ( $w + 10, $h + 10 );
  6. $iOut = imagecreate ( $w + 10, $h + 10 );
  7.  
  8. $background_color = imagecolorallocate( $iOut, 200, 200, 55 );
  9. imagefill ( $iOut, 0, 0, $background_color );
  10.  
  11. //imagecopymerge ( $iOut, $im, 0, 0, 0, 0, $w, $h, 100 );
  12. imagecopy ( $iOut, $im, 0, 0, 0, 0, $w, $h );
  13.  
  14. $trans_color = imagecolorexact( $iOut, 119, 123, 180 );
  15. imagecolortransparent ( $iOut, $trans_color );
  16.  
  17. //header ( 'Content-type: image/png' );
  18. //imagepng ( $iOut );
  19. header ( 'Content-type: image/gif' );
  20. imagegif ( $iOut );


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 01-11-2005 à 16:55:08    

Ah bah ca marche très bien merci :jap:
Je sais pas où j'ais raté quelque chose, certainement dans l'ordre des choses mais bon. Merci encore!

Reply

Marsh Posté le 01-11-2005 à 17:03:21    

dwogsi a écrit :

Je sais pas où j'ais raté quelque chose, certainement dans l'ordre des choses mais bon. Merci encore!


ouais, d'ailleurs moi aussi je me demande un truc, c'est quoi ce délire où soi disant la transparence n'est pas copiée avec imagecopy() si pas en truecolour (comme je le dis plus haut, en citant la doc), passke là ça marche sur un GD 2+ en 8bits, peut-être était-ce sur les versions pré 2.x ?
Il faut dire que la doc php (et même celle de GD) n'est pas très claire sur comportement/utilisation des fonctions selon pallette/truecolour ... m'enfin ...


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 01-11-2005 à 17:22:37    

Ouai de toute facon la doc sur GD franchement c'est un peu maigre... Et pas très clair comme tu l'as dit.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed