Page 1 sur 2
GD et transparence
Posté : 29 avr. 2015, 19:02
par Patriboom
Bonjour,
j'offre à mes usagers de télécharger des images, de préférence de PNG.
La transparence est importante dans ce processus.
Je fais appel à la bibliothèque GD (PEAR), mais voilà que la transparence des fichiers PNG téléchargés est chaque fois transformée en noir.
Y a-t-il quelque que je fasse incorrecterment?
Voici le code:
Code : Tout sélectionner
$HauteurFinale = 150;
$ImgSource = imagecreatefrompng($prefixe."temp/LogoTemporaire_".$_GET["Qui"].".png");
$TailleInitiale = getimagesize($prefixe."temp/LogoTemporaire_".$_GET["Qui"].".png");
imagealphablending($ImgSource, true);
imagesavealpha($ImgSource, true);
$LargeurFinale = ($TailleInitiale[0] / $TailleInitiale[1] ) * $HauteurFinale;
$ImgPetite = imagecreatetruecolor($LargeurFinale, $HauteurFinale);
// Redimensionnement
imagecopyresized($ImgPetite, $ImgSource, 0, 0, 0, 0, $LargeurFinale, $HauteurFinale, $TailleInitiale[0], $TailleInitiale[1]);
//Enregistrement final
imagepng($ImgPetite,$prefixe."rep/final/logo.png");
Merci de votre aide.
Re: GD et transparence
Posté : 29 avr. 2015, 19:18
par @rthur
Bonjour,
A première vue, je dirais que tu n'actives pas la transparence sur ton image finale $ImgPetite.
imagealphablending($ImgPetite, true);
imagesavealpha($ImgPetite, true);
Re: GD et transparence
Posté : 29 avr. 2015, 19:42
par Patriboom
Faudrait-il que j'inscrive false comme ceci?
Code : Tout sélectionner
imagealphablending($ImgPetite, false);
imagesavealpha($ImgPetite, false);
Merci.
Re: GD et transparence
Posté : 29 avr. 2015, 22:26
par @rthur
Pourquoi false ?
Re: GD et transparence
Posté : 05 mai 2015, 00:31
par Patriboom
Pourquoi false?
Parce que true n'a pas donné les résultats escomptés.
Je ne comprends pas la page d'information du manuel PHP à propos de cette commande.
C'est pourquoi je pose des questions ici et essaie tant bien que mal de trouver une solution.
Merci.
Re: GD et transparence
Posté : 06 mai 2015, 01:50
par @rthur
En fait imagesavealpha() permet justement d'avoir la couche alpha et donc la transparence si on le met à true

Mon 1er message était pour te signaler que dans ton code tu l'activais pour $ImgSource mais pas pour $ImgPetite alors qu'au final ton fichier généré est $ImgPetite
Re: GD et transparence
Posté : 06 mai 2015, 01:56
par Patriboom
Je révise et je vous reviens.
Merci.
Re: GD et transparence
Posté : 06 mai 2015, 02:10
par Patriboom
J'ai relu mon code et je fais du sur place.
Pour vous éviter de remonter, voici de nouveau le code:
Code : Tout sélectionner
$HauteurFinale = 150;
$ImgSource = imagecreatefrompng($prefixe."temp/Reception/LogoTemporaire_".$_GET["Qui"].".png");
$TailleInitiale = getimagesize($prefixe."temp/Reception/LogoTemporaire_".$_GET["Qui"].".png");
imagealphablending($ImgSource, true);
imagesavealpha($ImgSource, true);
$LargeurFinale = ($TailleInitiale[0] / $TailleInitiale[1] ) * $HauteurFinale;
$ImgPetite = imagecreatetruecolor($LargeurFinale, $HauteurFinale);
// Redimensionnement
imagecopyresized($ImgPetite, $ImgSource, 0, 0, 0, 0, $LargeurFinale, $HauteurFinale, $TailleInitiale[0], $TailleInitiale[1]);
//Enregistrement final
imagepng($ImgPetite,$prefixe."modules/Ecoles/".$_SESSION["AdminEcole"]."/images/logo.png");
Comme dit @rthur, je travaille avec $ImgPetite.
Je n'ai pas le choix, puisque la commande Imagecopyresized exige un fichier destination.
Je ne trouve pas d'option de transparence dans imagecreatetruecolor
Je ne puis me permettre d'avoir un fichier png transparent qui resterait en « attentte » sur mon disque, car la taille ce fichier (hauteur, largeur) ne correspondrait qu'accidentellement aux dimensions de l'image soumise par l'usager.
Si je pouvais une fonction du genre imagecreatepngblank ce serait pratique.
Re: GD et transparence
Posté : 06 mai 2015, 02:11
par Patriboom
Peut-être ma réponse est-elle là: imagecreate plutôt que imagecreatetruecolor
Cette note
En général, nous recommandons l'utilisation de la fonction imagecreatetruecolor() au lieu de la fonction imagecreate() afin que l'opération sur l'image s'effectue avec une qualité la plus haute possible.
du manuel PHP m'a toujours bloqué.
J'essaie.
Re: GD et transparence
Posté : 06 mai 2015, 02:19
par Patriboom
Non.
En local, du moins, la transparence est remplacé par du noir.
Re: GD et transparence
Posté : 06 mai 2015, 06:30
par Patriboom
Bonsoir,
Résumé: ni la commande imagecreate ni la commande imagecreatetruecolor ne donnent une image PNG à fond transparent à partir du code suivant:
Code : Tout sélectionner
$ImgSource = imagecreatefrompng($prefixe."temp/Reception/LogoTemporaire_".$_GET["Qui"].".png");
$TailleInitiale = getimagesize($prefixe."temp/Reception/LogoTemporaire_".$_GET["Qui"].".png");
imagealphablending($ImgSource, true);
imagesavealpha($ImgSource, true);
$LargeurFinale = ($TailleInitiale[0] / $TailleInitiale[1] ) * $HauteurFinale;
// $ImgPetite = imagecreatetruecolor($LargeurFinale, $HauteurFinale);
$ImgPetite = imagecreate($LargeurFinale, $HauteurFinale);
// Redimensionnement
imagecopyresized($ImgPetite, $ImgSource, 0, 0, 0, 0, $LargeurFinale, $HauteurFinale, $TailleInitiale[0], $TailleInitiale[1]);
//Enregistrement final
imagepng($ImgPetite,$prefixe."modules/Ecoles/".$_SESSION["AdminEcole"]."/images/logo.png");
Où est mon erreur ?
Merci.
Re: GD et transparence
Posté : 06 mai 2015, 09:38
par @rthur
J'ai revérifié la doc, si tu mets imagesavealpha() à true, alors il faut mettre imagealphablending() à false.
Et ensuite, comme je te l'ai déjà dit précédemment,
il faut que tu appliques imagesavealpha() à $ImgPetite et pas à $ImgSource (enfin tu peux le faire aussi à $ImgSource mais ça ne sert à rien).
$ImgSource = imagecreatefrompng($prefixe."temp/Reception/LogoTemporaire_".$_GET["Qui"].".png");
$TailleInitiale = getimagesize($prefixe."temp/Reception/LogoTemporaire_".$_GET["Qui"].".png");
$LargeurFinale = ($TailleInitiale[0] / $TailleInitiale[1] ) * $HauteurFinale;
$ImgPetite = imagecreatetruecolor($LargeurFinale, $HauteurFinale);
imagealphablending($ImgPetite, false);
imagesavealpha($ImgPetite, true);
/* Redimensionnement */
imagecopyresized($ImgPetite, $ImgSource, 0, 0, 0, 0, $LargeurFinale, $HauteurFinale, $TailleInitiale[0], $TailleInitiale[1]);
/* Enregistrement final */
imagepng($ImgPetite,$prefixe."modules/Ecoles/".$_SESSION["AdminEcole"]."/images/logo.png");
Re: GD et transparence
Posté : 06 mai 2015, 16:18
par Patriboom
Merci encore une fois @rthur.
Les résultats escomptés ne sont pas encore au rendez-vous.
Je remonte le code et trouve sur mon chemin une commande javascript qui peut tout expliquer: « uploadfile » avec un redimensionnement de fichier.
Voici la fonction javascript que je crois coupable de mes tourments:
Code : Tout sélectionner
function ChargeonsImage (Qui) {
var nom = document.getElementById('Fichier_1').value;
if (nom.substr(nom.length-3, nom.length) != 'png' && nom.substr(nom.length-3, nom.length) != 'PNG') { alert("Vous ne pouvez ici soumettre qu`un fichier au format PNG (ou png). \n\nSi vous ne disposez que de fichier jpg, veuillez l`envoyer à patrick arobas cartefoi point net" ); return false; }
document.getElementById("CetteImg_1").style.visibility = 'hidden';
document.getElementById('FormUpload_Barre').style.visibility = 'visible';
uploadFile(1, 'temp/Reception', 'LogoTemporaire_'+Qui, Qui, 250, 150);
}
J'enlève le redimensionnement.
Code : Tout sélectionner
uploadFile(1, 'temp/Reception', 'LogoTemporaire_'+Qui, Qui);
Et le fichier n'est plus copié dans mon répertoire temporaire. Le reste du script PHP est hors d'usage.
Il faut que j'arrive à me libérer de ce redimensionnement javascript, peut-être en récupérant les valeurs existantes du fichier reçu et le répétant en tant que valeurs dans la commande uploadfile. Là, on plonge dans le javascript.
Ça progresse.
Re: GD et transparence
Posté : 06 mai 2015, 16:44
par Patriboom
Mes excuses.
UpLoadFile que j'ai ici dans le javascript est une fonction empruntée. Elle est destinée à traiter des images jpg.
Mon erreur. Veuillez me pardonner.
Je cherche à corriger.
Merci encore @rthur, c'est sûr qu'avec vos corrections ça ira mieux.
Très utile même, car le même changement de code doit être apporté au script de réception d'une quelconque image:
false dans imagecreateblending
true dans imagesavealpha
Et ça marche!!!!
Merci @rthur.
La chose se passe ainsi: dès le clic donné, javascript exige de PHP que l'image soit conservée dans un dossier temporaire
- premier traitement passant par
Code : Tout sélectionner
$ImgSource = imagecreatefrompng($CetteImage['tmp_name']);
$TailleInitiale = getimagesize($CetteImage['tmp_name']);
$LargeurFinale = ($TailleInitiale[0] / $TailleInitiale[1] ) * $HauteurFinale;
$ImgPetite = imagecreatetruecolor($LargeurFinale, $HauteurFinale);
imagealphablending($ImgPetite, false);
imagesavealpha($ImgPetite, true);
Lors d'un clic de confirmation de la part de l'usager, second traitement passant par un autre occurrence - légèrement différente de
Code : Tout sélectionner
$ImgSource = imagecreatefrompng($CetteImage['tmp_name']);
$TailleInitiale = getimagesize($CetteImage['tmp_name']);
$LargeurFinale = ($TailleInitiale[0] / $TailleInitiale[1] ) * $HauteurFinale;
$ImgPetite = imagecreatetruecolor($LargeurFinale, $HauteurFinale);
imagealphablending($ImgPetite, false);
imagesavealpha($ImgPetite, true);
D'où la magie d'@arthur avec le changement de séquence, le changement de nom de fichier traité par imagealphablending et imagesavealpha, le changement de paramètres en ces deux dernières commandes.
Merci.
Re: [RESOLU] GD et transparence
Posté : 06 mai 2015, 19:24
par Patriboom
En guise de remerciement et afin d'éclairer ceux qui ont suivi le dossier ou le suivrait dans l'avenir, voici comment je comprends la séquence de création d'une image avec les fonctions PHP appelées ci-haut.
Quand on définit une nouvelle image, on doit initialiser le processus, puis définir les propriétés et enfin emplir le fichier de couleurs.
Prenons ici les commandes qui ont été citées, utilisées dans mon projet.
Prenons la comparaison d'une photo prise avec un appareil numérique de base.
1) On définit la future image: imagecreatetruecolor
On sort l'appareil photo et on le met sous tension
2) On en définit les propriétés: imagealphablending et imagesavealpha
On choisit d'activer ou non le flash, on choisit une amélioration préprogramée de la caméra (compensation au mouvement par exemple)
3) On emplit le fichier de couleur: imagecopyresized (ici, on puise les couleurs d'une autre image)
On appuie sur le déclencheur.