Problème de transparence

Eléphant du PHP | 60 Messages

08 sept. 2006, 21:50

Je redimentionne une image au format PNG, mais malheureusement la transparence de fond de l'image originale est remplacée par un fond noir !!!

J'utilise cette classe récupérée sur classes.scriptsphp.org et un peu bricolée :

class clImg
  {
  var $bg;
  var $bgx;
  var $bgy;
  var $color;

  function clImg ($szFic="")
    {
    $this->fctAjtBackground($szFic);
    }

  function fctCreImgAvecType($szFic, $handler)
    {
    $tbSize = getimagesize($szFic);
    $wType=$tbSize[2];
    switch ($wType)
      {
      case 2 :
        $hdImg = imagecreatefromjpeg($szFic);
        break;
      case 3 :
        $hdImg = imagecreatefrompng($szFic);
        break;
      case 1 :
        $hdImg = imagecreatefromgif($szFic);
        break;
      }
    $this->bgx=$tbSize[0];
    $this->bgy=$tbSize[1];

    return $hdImg;
    }

  function fctImgCalibre($inHoLarg, $inVeLarg)
    {
    // Détection du format de l'image : horizontale ou verticale
    if ($this->bgx > $this->bgy)	{ $inDestLarg = $inHoLarg; }
    else			{ $inDestLarg = $inVeLarg; }
    // Contrôle s'il est nécessaire de redimentionner l'image
    if ($inDestLarg > $this->bgx)
      return FALSE;
    // Calcul des dimentions de destinations et redimentionne
    $inCoef = $this->bgx / $inDestLarg;
    $inDestHaut = (int)($this->bgy / $inCoef);
    $this->fctImgResize($inDestLarg, $inDestHaut);
    }
	
  function fctImgResize ($inDestLarg , $inDestHaut)
    {
    $hdImgDest = imagecreatetruecolor($inDestLarg, $inDestHaut);
    $hdImgSrc = $this->bg;
    imagecopyresampled($hdImgDest, $hdImgSrc, 0, 0, 0, 0, $inDestLarg, $inDestHaut, $this->bgx, $this->bgy);
    $this->bg=$hdImgDest;
    imagedestroy($hdImgSrc);

    $this->bgx=$inDestLarg;
    $this->bgy=$inDestHaut;
    return TRUE;
    }

  function fctAjtBackground($szFic)
    {
    if (!empty($szFic) && file_exists($szFic))
      $this->bg = $this->fctCreImgAvecType($szFic,'bg');
    imagealphablending($this->bg , TRUE);
    }
  }
Classe utilisée comme ceci :

$obImg = new clImg("MonImage.png");
$obImg->fctImgCalibre(150, 150);
Ce noircissement ne serait il pas dû au format PNG qui gèe mal la transparence ?

Merci d'avance

Amicalement

Stéphane

Eléphant du PHP | 184 Messages

08 sept. 2006, 22:40

Le problême ne vient pas du format en lui-même mais du navigateur, tu utilises IE? les versions actuelles d'IE ne gêrent pas la transparence du PNG 24bit mais le 8bit est supporté. IE7 devrait quant à lui gérer ce format sans probleme (à voir).
Image

Eléphant du PHP | 60 Messages

09 sept. 2006, 18:17

Bien alors si c'est IE que traite mal la transparence pour puis-je afficher l'image originale au format PNG correctement, c'est seulement après traitement que cela ne fonctionne pas et que la transparence disparait.

Amicalement

Stéphane

Eléphant du PHP | 60 Messages

12 sept. 2006, 20:18

Bien j'accepte (sans comprendre) que c'est IE qui ne traite pas la transparence.

Alors comment remplacer cette transparence par un fond blanc ?

Merci de vos réponses

Amicalement

Stéphane

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 sept. 2006, 23:54

Bien alors si c'est IE que traite mal la transparence pour puis-je afficher l'image originale au format PNG correctement
IE gère correctement les PNG 8bit, format que tu dois avoir en entrée, mais pas les PNG 24bit que tu dois obtenir en sortie :)

Eléphant du PHP | 177 Messages

13 sept. 2006, 10:07

Si tu veux une image avec transparence :
png 8bits
ou passe en format giff la la transparence est supportée.
Sinon tu refait ton image png jpg ou autre avec le fond, l'arriere plan de la page ou tu veux inserer ton image.
Si tu n'as qu'une seul couleur unit c'est tres simple, par contre si il y a plusieures couleur, motifs, degrader ba la le mieux c'est de traivailler directement sur la maquette de ton site. Si tu n'en as pas travail sur un imprime ecran.

Eléphant du PHP | 60 Messages

13 sept. 2006, 13:03

Bon déjà, j'y voie plus clair, je peu donc supposer que j'ai des PNG en 8 bits (j'ai cherché si je pouvais retrouver cette infos, mais... pas trouvé).

Alors :
1. Existe t'il une solution pour redimentionner tout en restant en PNG 8 bits.
2. Sinon je vais remplacer le fond transparent, par un fond bland, mais je ne sais comment faire.

Amicalement

Stéphane

Eléphant du PHP | 177 Messages

14 sept. 2006, 13:45

Re la c'est plus dans le domaine de l'infographie mais je te conseil de te raprocher de THE GIMP qui est tres performant et gratuis ^^

Eléphant du PHP | 60 Messages

21 sept. 2006, 20:45

THE GIMP est unoutil de retouche photo.

Je souhaite seulement modifier mon code ci-dessus pour remplacer le fond noir automatique par un fond blanc.

Pouvez vous m'aider

Amicalement

Stéphane

Eléphant du PHP | 139 Messages

25 sept. 2006, 04:10

salut,

rajoute c'est 2 lignes dans la fonction fctImgResize

juste apres :

$hdImgDest = imagecreatetruecolor($inDestLarg, $inDestHaut);

Code : Tout sélectionner

$blanc = imageColorAllocate($hdImgDest, 255, 255, 255); imagefilledrectangle ( $hdImgDest, 0, 0, $inDestLarg, $inDestHaut, $blanc );
et normalement ça devrait fonctionner (pas testé).