Page 1 sur 1

GD : transparence png

Posté : 30 janv. 2008, 12:14
par Boukicodeur
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

Posté : 30 janv. 2008, 12:20
par Calimero
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-)

Posté : 30 janv. 2008, 12:25
par Boukicodeur
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']);

Posté : 30 janv. 2008, 12:59
par Calimero
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 ;-)

Posté : 30 janv. 2008, 13:03
par Boukicodeur
désolé je n'avais pas lu le manuel concernant cette fonction

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

Posté : 30 janv. 2008, 13:25
par Calimero
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.

Posté : 30 janv. 2008, 13:30
par Boukicodeur
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 ?!

Posté : 30 janv. 2008, 16:28
par Hubert Roksor
Il n'y a pas de transparence alpha dans les PNG 8bit, il te faut les sauver en 24bit+alpha, avec un fond transparent.