[RESOLU] GD et transparence

Mammouth du PHP | 881 Messages

29 avr. 2015, 19:02

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.
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 avr. 2015, 19:18

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);
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

29 avr. 2015, 19:42

Faudrait-il que j'inscrive false comme ceci?

Code : Tout sélectionner

imagealphablending($ImgPetite, false); imagesavealpha($ImgPetite, false);
Merci.
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 avr. 2015, 22:26

Pourquoi false ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

05 mai 2015, 00:31

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.
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 mai 2015, 01:50

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
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

06 mai 2015, 01:56

Je révise et je vous reviens.
Merci.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

06 mai 2015, 02:10

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.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

06 mai 2015, 02:11

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.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

06 mai 2015, 02:19

Non.
En local, du moins, la transparence est remplacé par du noir.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

06 mai 2015, 06:30

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.
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 mai 2015, 09:38

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");
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

06 mai 2015, 16:18

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.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

06 mai 2015, 16:44

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.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

06 mai 2015, 19:24

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.
Soyez artisans de paix