Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Allegement du poids des images

3 réponses
Avatar
edo999
Bonjour à tous,

Je travaille sur un script destiné à afficher des images dont le
poids soit inférieur à une taille maximale donnée.
Tout marche parfaitement en Jpeg, voici comment le code fonctionne:
* Calcul du poids de l'image avec quality = 99
* Si poids > poids_max alors on retente en décrementant quality de 1
* Si poids < poids_max alors on affiche l'image

Là, où ça se complique, c'est lorsque tente la même chose au format
PNG (ou GIF). J'ai tenté de programmer un script fonctionnant comme
ceci :
* Calcul du poids de l'image en 256 couleurs
* Si poids > poids_max alors on retente en décrementant couleur de 1
* Si poids < poids_max alors on affiche l'image

Il semble qu'une fois qu'une image en True Color est transformée en
image à palette avec imagetruecolortopalette, il est impossible de
remodifier la palette par la suite.
Pire, lorsque le script appelle imagetruecolortopalette, on dirait que
cela affecte toutes les images que pourraient traiter le script. Les
appels suivant à imagetruecolortopalette ne donnent aucun résultat.

En clair, il me faudrait une fonction capable de passer d'une image à
palette à une autre image à palette plus réduite.

Quelqu'un a-t-il une idée ?

3 réponses

Avatar
clifden
wrote:
Bonjour à tous,

Je travaille sur un script destiné à afficher des images dont le
poids soit inférieur à une taille maximale donnée.
Tout marche parfaitement en Jpeg, voici comment le code fonctionne:
* Calcul du poids de l'image avec quality = 99
* Si poids > poids_max alors on retente en décrementant quality de 1
* Si poids < poids_max alors on affiche l'image



Cela ne réponds pas à ton problème, mais:
Ne pourrais-tu pas faire de manière dichotomique afin d'optimiser un peu
le temps de fabrication?
$a=0;
$b0;
while ($b>$a+1) {
$q=($a+$b)/2;
// fabrique l'image
...

if ($poids>$poids>$max) $b=$q;
if ($poids<$poids>$max) $a=$q;
}

Avatar
Edo
Excellente optimisation. Maintenant, la boucle n'est répétée que 7
fois au lieu de 25 dans le cas d'une qualité à 85% !
Merci beaucoup.

Quelqu'un peut m'aider à réduire la palette d'une image ? cf. 1er
post.
Avatar
Xavier Garreau
Excellente optimisation. Maintenant, la boucle n'est répétée que 7
fois au lieu de 25 dans le cas d'une qualité à 85% !
Merci beaucoup.

Quelqu'un peut m'aider à réduire la palette d'une image ? cf. 1er
post.


En C, depuis gd2.0.28, il existe la fonction gdImagePtr
gdImageCreatePaletteFromTrueColor(gdImagePtr im, int ditherFlag, int
colorsWanted) qui conserve l'image originale.

Tu peux donc:
1. vérifier que l'équivalent n'existe pas dans php (sait-on jamais, même si ce
n'est pas dans la doc)
2. transformer ton script en cgi
3. essayer de modifier le module gd pour ajouter le wrapper autour de cette
fonction.
4. utiliser imagecopy avant imagetruecolortopalette pour garder ton image
d'origine intacte

a+
--
Xavier Garreau
http://www.xgarreau.org/