Aller au contenu

[GD] Chevauchements d'images transparantes


Sujets conseillés

Posté

Bonsoir,

Après plusieurs heures de recherches veines, je m'en remet à vous.

Je créer un script permettant d'écrire du texte sous forme d'images, je m'explique :

Chaque lettre de l'utilisateur correspond à une image .png transparente. Le problème c'est que les lettres se chevauchent et chaque partie transparente, rend en partie transparente l'image précédente, voici une image du problème :

181301.png

Voici mon script :

<?php
// Type de l'image
header ("Content-type: image/png");

// Informations texte
$lettres = stripslashes(htmlspecialchars($_GET['session_lettres']));
if($lettres == "") $lettres = "Erreur";
$width = 105*strlen($lettres);
$height = 155;

// Création de l'image
$image = imagecreate($width,$height);
$orange = imagecolorallocate($image, 255, 106, 0);

for ($i=0; $i <= strlen($lettres); $i++) // Boucle des lettres
{
// Chargement des lettres
$lettre = imagecreatefrompng("./images/lettres/".$lettres[$i].".png");
$width_lettre = imagesx($lettre);
$height_lettre = imagesy($lettre);

// Fusion des images
imagealphablending($lettre,false);
imagecopy($image, $lettre, $i*100, 0, 0, 0, $width, $height*2);
imagesavealpha($lettre,true);

}

imagecolortransparent($image, $orange);

// Création de l'image
imagepng($image);
?>

Posté

Bonjour Direct Sims,

je pense que ton problème viens du fait que tu copies l'image suivante 100 pixels plus loin que l'image précédente

imagecopy($image, $lettre, $i*100, 0, 0, 0, $width, $height*2);

Il faudrait plutôt créer un compteur qui ajoute la largeur de l'image $width_lettre dont tu ne te sers pas d'ailleurs. Par exemple :

imagecopy($image, $lettre, $xLettreSuivante, 0, 0, 0, $width, $height*2);
$xLettreSuivante+=$width_lettre;

Posté

Je précise que le chevauchement des lettres est voulut mais qu'il bug pour les problèmes que j'ai cité ci-dessus.

Merci de ta participation, j'espère que l'on va trouver le problème :1eye:

Posté (modifié)

Il ne faudrait pas plutôt utiliser imagecopymerge ?

Et d'après ce que j'ai lu, ça fonctionne plus facilement avec des .gif !

Modifié par cyberlaura
Posté (modifié)

Je te confirme que ça marche bien mieux avec des gif ! ( ab )

Bon, t'as que 65 lettres à reprendre ;)

Modifié par cyberlaura
Posté (modifié)

Oui moi aussi j'ai fait avec les gifs, mais j'ai après il y a le problème de qualité qu'il faut régler :IMSTP1: C'est vraiment un casse tête ce truc :dots:

EDIT: non le gif ne va pas, il ne gère qu'un seul niveau de transparence...

Modifié par Direct Sims
Posté

Il faut que tu crées l'image avec imagecreatetruecolor, et hop! Note que les imagealphablending et imagesavealpha sont inutiles.

Par contre c'est quoi le but du jeu avec l'orange? Si tu veux avoir tes lettres sur fond orange il va falloir faire un petit coup de imagefilledrectangle (par exemple) avant de copier les lettres dessus.

Jacques.

Posté

Là j'ai une belle erreur :unsure:

<?php
ini_set("memory_limit",'16M');

// Type de l'image
header ("Content-type: image/png");

// Informations texte
$lettres = stripslashes(htmlspecialchars($_GET['session_lettres']));
if($lettres == "") $lettres = "erreur";
$width = 100*strlen($lettres);
$height = 165;

// Création de l'image
$image = imagecreatetruecolor($width,$height);

for ($i=0; $i <= strlen($lettres); $i++) // Boucle des lettres
{
// Chargement des lettres
$lettre = imageformpng("http://creasims.simsous.directsims.com/images/lettres/".$lettres[$i].".png");
$width_lettre = imagesx($lettre);
$height_lettre = imagesy($lettre);

// Fusion des images
imagecopy($image, $lettre, $i*90, 0, 0, 0, $width_lettre, $height_lettre);
}

// Création de l'image
imagepng($image);
?>

Posté

1. C'est quoi l'erreur? Ca pourrait aider...

2. Le "imageformpng" au lieu de "imagecreatefrompng" ça ne doit pas aider...

Jacques.

Posté

Bonsoir !

J'ai deux choses à dire en premier merci beaucoup Jacques ! Je n'es plus de problème lors du chevauchement, par contre, l'image de fond de l'image est noir maintenant, plus transparentes...

Posté

Ajoute ça après le imagecreatetruecolor (et donc avant de copier tes lettres dessus):

imagesavealpha($image,true);
$transp = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image,0,0,$transp);

Jacques.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...