Gif à fond transparent

10 réponses
Avatar
Pascale
Bonjour à tous,

J'ai un répertoire comportant des images entrées par des utilisateurs. Ces
images sont censées être des logos, mais certaines sont vraiment trop
volumineuses. Mon objectif est donc de redimensionner ces photos.
Une partie de ces images sont en jpg et l'autre partie des images sont en
gif.
Redimensionner n'est pas en soi le problème, ça marche sauf que
j'ai un souci avec certains gif dont le fond est transparent : je me
retrouve avec un fond noir et c'est MAL (:
J'ai cherché sur le ouaibe et il semble que GD ait du mal avec les gif à
fond transparent. Je n'ai pas trouvé de solution convainquante. À la
rigueur, à défaut de fond transparent un fond blanc conviendrait, mais je
ne peux pas transformer le noir en blanc (certains logos contiennent
évidemment du noir).

Les dimensions des images sont bien sûr calculées auparavant. $chemin,
c'est le nom du fichier répertoire compris.

Pour les gif, je fais quelque chose du genre :

if (imagecreatefromgif($chemin) !== FALSE)
{
$logo = imagecreatefromgif($chemin);
if (imagecopyresampled($ph0,$logo, 0, 0, 0, 0, $lph0, $hph0,
$lori0, $hori0)!==FALSE)
{
$logo='logored/'.$image;
imagegif($ph0, $logo,100);
}
else
{
echo 'Erreur sur imagecopyresampled succédant à un imagecreatefromgif
réussi.<br>';
}
}
else
{
echo 'Erreur de imagecreatefromgif pour l\'image '.$image.'<br>';
}

Si quelqu'un veut bien éclairer ma lanterne...


--
Pascale

10 réponses

Avatar
Patrick 'Zener' Brunet
Bonjour.

"Pascale" <chaton.tigre+ a écrit dans le message
de news
J'ai un répertoire comportant des images entrées par des
utilisateurs. Ces images sont censées être des logos, mais
certaines sont vraiment trop volumineuses. Mon objectif est donc de
redimensionner ces photos.
Une partie de ces images sont en jpg et l'autre partie des images
sont en gif.
Redimensionner n'est pas en soi le problème, ça marche sauf que
j'ai un souci avec certains gif dont le fond est transparent : je me
retrouve avec un fond noir et c'est MAL (:
J'ai cherché sur le ouaibe et il semble que GD ait du mal avec les
gif à fond transparent. Je n'ai pas trouvé de solution
convainquante. À la rigueur, à défaut de fond transparent un fond
blanc conviendrait, mais je ne peux pas transformer le noir en
blanc (certains logos contiennent évidemment du noir).




Plein de trucs là:

http://www.php.net/manual/fr/function.imagecolortransparent.php

http://php.net/manual/fr/function.imagecreatefromgif.php

--
Cordialement.

* Patrick BRUNET www.ipzb.fr www.ipzb-pro.com
* E-mail: lien sur http://zener131.eu/ContactMe
Avatar
Pascale
"Patrick 'Zener' Brunet" écrivait
news:hl5u3h$7pe$:

http://www.php.net/manual/fr/function.imagecolortransparent.php



Exact, voilà ce qu'il me fallait ! J'avoue que je suis un peu paumée dans
toutes les fonctions de GD.
Ça marche, merci beaucoup !

--
Pascale
Avatar
Pascale
Et bien je m'aperçois que j'ai été bien trop optimiste !

En effet, je vois au moins 2 problèmes : ce logo sur fond noir
http://i60.servimg.com/u/f60/11/80/63/78/logo-n11.gif

devient
http://i60.servimg.com/u/f60/11/80/63/78/logo-n10.gif

Ce qui est plus que très vilain.

Autre souci : les gifs animés qui ne supportent pas du tout le traitement !
Si j'étais capable de les détecter, je pourrais à la rigueur les omettre,
mais je ne connais pas de moyen de le faire.

Bref, je suis pas sortie de l'auberge !

--
Pascale
Avatar
Pascale
Pascale <chaton.tigre+ écrivait
news::

En effet, je vois au moins 2 problèmes : ce logo sur fond noir
http://i60.servimg.com/u/f60/11/80/63/78/logo-n11.gif

devient
http://i60.servimg.com/u/f60/11/80/63/78/logo-n10.gif

Ce qui est plus que très vilain.



Encore moi...

Je n'ai pas trouvé pour l'instant comment résoudre ce problème.

Autre souci : les gifs animés qui ne supportent pas du tout le
traitement ! Si j'étais capable de les détecter, je pourrais à la
rigueur les omettre, mais je ne connais pas de moyen de le faire.



J'ai réussi à trouver une fonction qui détecte les gifs animés, ce qui me
suffit : les logos sont limités en « poids » et les gifs animés sont donc
rarement très grands.

--
Pascale
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Pascale ecrit ce qui suit en ce 13/02/2010 10:10 :
Bonjour à tous,



Bonsoir,

J'ai un répertoire comportant des images entrées par des utilisateurs. Ces
images sont censées être des logos, mais certaines sont vraiment trop
volumineuses. Mon objectif est donc de redimensionner ces photos.
Une partie de ces images sont en jpg et l'autre partie des images sont en
gif.
Redimensionner n'est pas en soi le problème, ça marche sauf que
j'ai un souci avec certains gif dont le fond est transparent



Je crois bien que ImageMagick (logiciel libre), à insérer dans le
formulaire utilisé par tes visiteurs, est capable de faire ça. Au moins
en jpg mais aussi dans une centaine de formats différents. J'ignore
toutefois s'il traite les gif's
L'automatisation pourrait t'éviter la tâche fastidieuse de
redimensionner les photos entrantes.

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Sergio
Pascale a écrit :
Et bien je m'aperçois que j'ai été bien trop optimiste !

En effet, je vois au moins 2 problèmes : ce logo sur fond noir
http://i60.servimg.com/u/f60/11/80/63/78/logo-n11.gif

devient
http://i60.servimg.com/u/f60/11/80/63/78/logo-n10.gif

Ce qui est plus que très vilain.

Autre souci : les gifs animés qui ne supportent pas du tout le traitement !
Si j'étais capable de les détecter, je pourrais à la rigueur les omettre,
mais je ne connais pas de moyen de le faire.



En tout cas, sur Wikipédia, les GIF animés sont réduit correctement sans perdre le fond, ni l'animation. Comment qu'ils font...
mystère...

--
Serge http://leserged.online.fr/
Mon blog: http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
Avatar
Pascale
docanski écrivait
news:hl79ai$1p5e$:

Je crois bien que ImageMagick (logiciel libre), à insérer dans le
formulaire utilisé par tes visiteurs, est capable de faire ça. Au moins
en jpg mais aussi dans une centaine de formats différents. J'ignore
toutefois s'il traite les gif's
L'automatisation pourrait t'éviter la tâche fastidieuse de
redimensionner les photos entrantes.



À l'heure actuelle, j'ai bien prévu un traitement automatique des images
entrantes à l'aide de GD qui a l'avantage d'être partie intégrante de PHP.
Je dois dire que je suis un peu réticente à l'idée d'ajouter un programme
externe à mon code.
Au départ, je ne m'étais pas aperçue que les gif animés posaient problème,
ainsi que ceux sur fond transparent. De plus, j'ai un existant à traiter,
et je travaille là-dessus actuellement. Je pense que je peux
raisonnablement ne pas redimensionner les gifs animés (ils sont rarement
très grands, compte tenu de la limitation de poids imposée).

Je pourrais aussi refuser carrément les images trop grandes (de même que
je refuse les images trop lourdes), mais la plupart des utilisateurs en
question ne savent pas redimensionner une image, il faut donc bien le faire
à leur place.
Le logo sur fond noir qui devient tout blanc et complètement illisible me
pose le plus gros souci. Certains gifs ont eux aussi un comportement
bizarre mais moins gênant : les zones blanches deviennent PARFOIS
transparentes. Ce n'est pas très gênant car les logos en question seront
affichés sur un fond quasiment blanc, mais quand même...

Pour les logos transparents, après avoir utilisé imagecreatefromgif et
imagecreatetruecolor, j'utilise une fonction pêchée directement sur le
manuel PHP :

function transparent($nouvimage,$image_source)
{
$transparenceIndex = imagecolortransparent($image_source);
$transparenceCouleur = array('red' => 255, 'green' => 255, 'blue' => 255);
if ($transparenceIndex >= 0)
{
$transparenceCouleur = imagecolorsforindex($image_source,
$transparenceIndex);
}
$transparenceIndex = imagecolorallocate($nouvimage,
$transparenceCouleur['red'], $transparenceCouleur['green'],
$transparenceCouleur['blue']);
imagefill($nouvimage, 0, 0, $transparenceIndex);
imagecolortransparent($nouvimage, $transparenceIndex);
}

Ensuite, je fais un imagecopyresampled et un imagegif.

Je repère les gifs animés là aussi à l'aide d'une fonction trouvée sur le
manuel PHP, qui semble marcher de manière tout à fait satisfaisante :

function est_ani($fichier)
{
$compte= (bool)preg_match('#(x00x21xF9x04.{4}x00x2C.*){2,}#s',
file_get_contents($fichier));
return $compte;
}

--
Pascale
Avatar
Patrick 'Zener' Brunet
Bonjour.

"Pascale" <chaton.tigre+ a écrit dans le message
de news
Et bien je m'aperçois que j'ai été bien trop optimiste !

En effet, je vois au moins 2 problèmes : ce logo sur fond noir
http://i60.servimg.com/u/f60/11/80/63/78/logo-n11.gif

devient
http://i60.servimg.com/u/f60/11/80/63/78/logo-n10.gif

Ce qui est plus que très vilain.

Autre souci : les gifs animés qui ne supportent pas du tout le
traitement ! Si j'étais capable de les détecter, je pourrais à la
rigueur les omettre, mais je ne connais pas de moyen de le faire.

Bref, je suis pas sortie de l'auberge !



Je n'ai jamais utilisé, mais sur la page de mon second lien, il y a dans la
partie forum des infos sur la manière de détecter les GIFs animés, et aussi
sur la structure interne du fichier.
Je pense qu'il faut partir de là pour traiter séparément les frames (il
faudra peut-être découper le fichier), sur la base d'une palette commune.

--
Cordialement.

* Patrick BRUNET www.ipzb.fr www.ipzb-pro.com
* E-mail: lien sur http://zener131.eu/ContactMe
Avatar
Anne G
Le 2/14/10 3:21 AM, Pascale a écrit :

Le logo sur fond noir qui devient tout blanc et complètement illisible me
pose le plus gros souci.



Je l'inverserais, tout simplement.
Noir sur fond blanc.
Avatar
Pascale
Anne G [anti-spam].com.invalid> écrivait news:
versailles.fr:

Je l'inverserais, tout simplement.
Noir sur fond blanc.



Oui, c'est certain, mais comment automatiser ce genre de traitement en
étant sûr du résultat ?

Après de multiples tests il apparaît que la réduction automatique des gifs
est vraiment galère.

imagecreatefromgif($chemlogonouv);
transparent($ph0,$logonouv);
imagecopyresampled($ph0,$logonouv, 0, 0, 0, 0, $lph0, $hph0, $lori0,
$hori0);
imagegif($ph0, $logonouv,100);

...la fonction « transparent » étant définie ainsi :
$transparenceIndex = imagecolortransparent($image_source);
$transparenceCouleur = array('red' => 255, 'green' => 255, 'blue' => 255);
if ($transparenceIndex >= 0)
{
$transparenceCouleur = imagecolorsforindex($image_source,
$transparenceIndex);
}
$transparenceIndex = imagecolorallocate($nouvimage,
$transparenceCouleur['red'], $transparenceCouleur['green'],
$transparenceCouleur['blue']);
imagefill($nouvimage, 0, 0, $transparenceIndex);
imagecolortransparent($nouvimage, $transparenceIndex);

Tout cela donne un résultat au mieux pas net et au pire, très moche, alors
que le redimensionnement des jpg se passe vraiment sans douleur.

Donc, comme j'en ai marre de chercher des solutions trop compliquées pour
mes deux neurones, je vais procéder ainsi :

- pour l'existant : je redimensionne automatiquement les images en jpg qui
le nécessitent. Je ne touche pas aux gifs. Je redimensionne à la main, avec
mon FastStoneViewer préféré, la demie-douzaine d'images en gif qui
nécessitent d'être redimensionnées. C'est pas la mer à boire.

- pour le futur applicatif : je redimensionne les jpg qui le nécessitent,
je laisse passer les gifs qui ne dépassent pas la limite de dimension que
j'ai fixée. Je refuse carrément (message d'erreur) les gifs qui
dépasseraient les limites requises.

Je ne vais pas non plus passer toutes mes vacances là dessus, non mais (-:

Merci à tous ceux qui m'ont aidée, j'ai appris des trucs intéressants !

--
Pascale