Forum Programmation.php Créer une image png transparente

Posté par .
Tags : aucun
0
17
avr.
2005
Bonjour

J'ai écrit pour mon site une galerie d'images. Pour faire mieux, j'aimerais y mettre de la transparence.
J'ai pour l'instant utilisé l'attribut CSS3 opacity, mais seul mozilla le supporte ! J'aimerais donc mettre des miniatures transparentes en png... (comme les images de cette page : http://www.libpng.org/pub/png/png-rgba32.html(...) )
Les images de la galerie sont au format jpeg, et je les transforme en miniatures au format png en utilisant les fonctions d'image de PHP.
Comment faire pour mettre de la transparence ? (La documentation de php est franchement peu claire là dessus !)

Merci d'avance
  • # En même temps...

    Posté par . Évalué à 1.

    l'attribut CSS3 opacity, mais seul mozilla le supporte
    Si tu veux utiliser des PNG transparents pour que ça passe aussi sous Internet Explorer, je crois que ça reviendra à peu près au même :)..
    • [^] # Re: En même temps...

      Posté par . Évalué à 2.

      Y'a pas que IE et mozilla dans la vie !
      Y'a aussi Opera, Konqueror, Safari (tiens, lui je crois qu'il supporte opacity)...
  • # Hello

    Posté par . Évalué à 1.

    IE7 inclue une formule magique pour faire accepter à IE des PNG transparents.

    http://dean.edwards.name/IE7/(...)
    • [^] # Re: Hello

      Posté par . Évalué à 4.

      J'ai mes raisons pour ne pas utiliser IE7 :
      1- c'est un hack, son fonctionnement n'est pas garanti en cas de mise à jour d'IE
      2- utiliser IE7 revient à dire aux visiteurs : "votre IE supporte pas les standards mais bon, c'est pas grave je m'en fous j'utilise des hacks pour qu'il les supporte", alors que j'ai plutôt tendance à dire "IE supporte pas les standards <=> je supporte pas IE"
      3- c'est lourd !
      4- la formule magique spéciale png est dispo séparement sur de nombreux sites
      5- IE supporte pas ma CSS donc la transparence ne lui servira pas
      • [^] # Re: Hello

        Posté par . Évalué à 1.

        Vu que tu ouvres le débat, je te réponds :

        1/ Le fonctionnement d'IE lui-même n'est pas garanti en cas de mise à jour, je ne vois pas comment ca pourrait être pire... De plus IE7 est très sélectif dans sa façon d'agir et ne devrait pas faire souffrir les versions futures (plus conformes aux standards ? on peut rêver...) d'IE.

        2/ Ca revient à rendre IE un peu moins insupportable en codant "standard" et en espérant que ca passe mieux que par défaut. C'est donc un geste à la fois pour ton visiteur et pour toi (Rappelle toi qu'il y a des gens qui utilisent IE car ils y sont contraints, au travail par exemple...).

        3/ C'est ignoré par tous les autres navigateurs vu que c'est inclus comme commentaire conditionnel, une astuce que seul IE prend en compte. Ce n'est donc lourd *que* là ou c'est censé agir. Et ca représente seulement une quarantaine d'octets dans la page, donc l'argument lourdeur me parait pour le moins écorné... (ce n'est pas plus lourd pour le client que les effets de transparence à tire-larigot, ceci dit).

        4/ Certes, il y en a d'autres, tu as raison. Mais celle d'IE7 est une de celles qui marchent le mieux pour des raisons que je ne m'attarderais pas à expliquer (trop long).

        5/ C'est tout l'intérêt d'IE7 ! Ta CSS passera sans doute mieux qu'elle ne passe maintenant, la transparence en sus.

        Bref, bouder IE par conviction, pourquoi pas... mais ca ressemble trop à "optimisé pour X,Y,Z avec 12 plugins et telle résolution", comme raisonnement, je trouve ça archaïque :-) Surtout quand des solutions existent pour améliorer les choses à moindre effort.
  • # Solution

    Posté par . Évalué à 2.

    Bon, quelqu'un sur IRC (Calimero, alias Tipiak : http://linuxfr.org/~Cali_Mero/(...) ) m'a fourni une solution clés en main :)
    Je vous la fournis (et j'avoue que j'aurais jamais été capable de la trouver seul avec la documentation de PHP !)
    function modif_alpha($src , $dest , $alpha){
     /* 
     * webmaster@creatixnet.com - licence bananière 
     * ("faites de ce code ce que vous voulez...")
     *
     * Paramètres : $src : fichier source
     * $dest : fichier de destination
     * $alpha : transparence (entre 0 (opaque) et 127 (transparent))
     *
     * EX : modif_alpha('image.jpg', 'image.png', 70)
     * rend l'image à moitié transparente.
     */ 
     
     if (file_exists($src)) $size = getimagesize($src);
     else return FALSE; 
     
     switch($size[2])
     {
      case 1 :
       if (imagetypes() & IMG_GIF)
        $pic = imagecreatefromgif($src);
       break;
      case 2 :
       if (imagetypes() & IMG_JPG)
        $pic = imagecreatefromjpeg($src);
       break;
      case 3 :
       if (imagetypes() & IMG_PNG)
        $pic = imagecreatefrompng($src);
       break;
      default :
       if (preg_match("/\.wbmp$/i", $src) && (imagetypes() & IMG_WBMP))
        $pic = imagecreatefromwbmp($src);
     }
     if (!$pic) return FALSE;
     
     
     $new=imagecreatetruecolor($size[0], $size[1]);
     imagealphablending($new, FALSE);
     imagesavealpha ($new, true);
     $colors_num = imagecolorstotal($pic);
     
     
     for($x=0;$x<$size[0];$x++) {
       for($y=0;$y<$size[1];$y++) {
         $colorat=imagecolorat($pic,$x,$y);
         $color = imagecolorsforindex($pic, $colorat);
         $r = $color["red"];
         $g = $color["green"];
         $b = $color["blue"];
         $idx=imagecolorallocatealpha($new,$r,$g,$b,$alpha);
         imagesetpixel($new,$x,$y,$idx);
       }
     }
     imagepng($new, $dest);
     return TRUE;
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.