GD : transparence png

Petit nouveau ! | 5 Messages

30 janv. 2008, 12:14

bonjour
je suis confronté à un problème que je n'arrive pas à résoudre :/

j'ai une image créé par imagecreate sur laquelle j'utilise de multiples imagecopy (de png-8 transparents) et imagettftext
malheuresement la transparence foire completement (c'est une transparence "mixte", c'est à dire une couleur à moitié transparente), et le texte écrit après avoir mis les images ne prend pas la couleur attendu

voici le résultat attendu :
Image
et le résultat obtenu
Image

j'ai déjà essayé sans succès les :

Code : Tout sélectionner

imagealphablending($this->Image, false); imagesavealpha($this->Image, true);
[/img]

les images sources :
Image
Image

ViPHP
ViPHP | 2287 Messages

30 janv. 2008, 12:20

Bonjour,

Si tu copies ici ton code, on pourra peut-être te dire un peu plus que "ah ben mince, c'est dommage ça". 8-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

30 janv. 2008, 12:25

il y a pas mal de code, je laisse uniquement l'essentiel

ImageCreate.php
<?PHP

class ImageCreate
{

public function __construct($Width, $Height)
{
    $this->Image = imagecreate($Width, $Height);
    imagealphablending($this->Image, false);
    imagesavealpha($this->Image, true);
    $this->Width = $Width;
    $this->Height = $Height;
}

public function getImage()
{
    return $this->Image;
}

public function getWidth()
{
    return $this->Width;
}

public function getHeight()
{
    return $this->Height;
}

public function getColor($Hexadecimal)
{  
    return imagecolorallocate($this->Image, hexdec(substr($Hexadecimal, 1, 2)), hexdec(substr($Hexadecimal, 3, 2)), hexdec(substr($Hexadecimal, 5, 2)));
}

public function display()
{
    header('Content-type: image/png'); 
    imagepng($this->Image);
    imagedestroy($this->Image);
}

public function save($Path)
{
    imagepng($this->Image, $Path);
    imagedestroy($this->Image);
}  

private $Image;
private $Width;
private $Height;
}

?>
Image.php
<?PHP

class Image
{

public function __construct(ImageCreate $Image, $Source, $Width, $Height, $Position_X, $Position_Y)
{
    $ImageSource = imagecreatefrompng($Source);
    imagecopy($Image->getImage(), $ImageSource, $Position_X, $Position_Y, 0, 0, $Width, $Height);    
}

}  
  
?>
une partie d'une classe...
    $this->Image = new ImageCreate($this->Width, $this->Height);
    new Image($this->Image, $this->AvailableImages[$Background1], $this->Width, $this->Height, 0, 0);  
    new Image($this->Image, $this->AvailableImages[$Background2], 305, 118, 0, 0);  
    new Image($this->Image, $this->AvailableImages[$Background3], 305, 42, 0, 0);  
    new Text($this->Image, 215, 20, $Hotel1, '#3366FF', 14, $this->AvailableFonts['TIMES']);
    new Text($this->Image, 180, 40, $Hotel2, '#3366FF', 14, $this->AvailableFonts['TIMES']);

ViPHP
ViPHP | 2287 Messages

30 janv. 2008, 12:59

As-tu lu les premières lignes de la page de manuel d'imagecreate ?

En l'occurence elles te donnaient la réponse, car c'est bien imagecreatetruecolor() que tu dois utiliser à la place.

Essaye de faire le(s) remplacement(s) dans ton code et dis-nous le résultat ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

30 janv. 2008, 13:03

désolé je n'avais pas lu le manuel concernant cette fonction

en utilisant imagecreatetruecolor j'obtiens une légère amélioration
Image

ViPHP
ViPHP | 2287 Messages

30 janv. 2008, 13:25

C'est un début. Là on voit qu'il n'a pas respecté l'alpha lors de la fusion des images, et c'est imagecopy() qui est coupable.

Tu peux continuer en remplaçant les appels à imagecopy() par imagecopymerge() dont je t'invite à aller lire le manuel. Il faut positionner le dernier paramètre à la valeur 100.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

30 janv. 2008, 13:30

merci
j'étais déjà sur cette fonction grace à ton aide
il me reste 1 probleme a résoudre qui doit etre facilement résolvable (le fond blanc derrière l'écriture), le reste je peut m'en occuper seul :)
j'utilise imagettftext
d'après ce que j'ai compris il faudrait jouer sur le parametre color ?!

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 janv. 2008, 16:28

Il n'y a pas de transparence alpha dans les PNG 8bit, il te faut les sauver en 24bit+alpha, avec un fond transparent.