Bonsoir,
J'ai parcouru le code de tous les filtres image (surtout pour image_reduire() qui passe dans plein de fonctions), mais sans réellement trouver où me brancher pour pouvoir appliquer une qualité variable selon la taille de l'image.
Il y a deux pipelines image_ecrire_tag_preparer et image_ecrire_tag_finir appelés à chaque filtre image pour produire la balise img. Ce peut être un bon endroit pour y faire des modifications systématiques.
Je ne sais pas si cela conviendrait parfaitement à ton besoin, car dans le cas où plusieurs filtres s'enchainent il ne faut faire la réduction de compression que sur l'image finale et non à chaque étape.
Ce peut être le bon endroit pour diviser le width et le height par 2 dans le HTML par exemple.
J'aurais tendance à dire que ton besoin requiert plutôt un filtre dédié |image_optimiser qui adaptera l'optimisation à l'image et pourrait prendre en compte des paramètres supplémentaires.
Mon idée est que des images JPEG de petite taille souffrent plus d'un fort taux de compression que des grandes. D'autant plus que je fais ça dans un cadre d'optimisation pour écrans à forte densité de pixels où je mets certaines images de taille x2 réduites en CSS, donc très lourdes si compressées avec le taux par défaut de 85, alors qu'une compression de 50 suffit.
Attention, j'ai vu dans une démo de Thomas Fuchs sur laquelle je n'arrive pas à remettre la main que cela améliore en effet le rendu sur écran rétina, mais a contrario l'image haute densité à compression augmentée donne un résultat moins bon sur un écran normal.
J'ai trouvé l'astuce de mettre define('_IMG_GD_QUALITE', 85); dans mes_options.php puis d'utiliser le filtre suivant dans mes squelettes :
>image_aplatir{jpg,000000,50}
Mais si j'applique ça sur #TEXTE :
- toutes les images, quelle que soit leur taille, vont se retrouver à un taux de compression de 50
- toutes mes images vont se retrouver en JPEG, ce qui est potentiellement encore pire
Alors j'ai déjà eu ce besoin pour appliquer une décoration sur toutes les images mais pas les puce, et il y a un filtre pour cela :
image_select{width_min,height_min,width_max,height_max}
qui selectionne les images (par leur dimensions) sur lesquelles seront appliqués les filtres qui suivent
Tu peux donc enchainer par exemple
image_select{0,0,500,500}|image_aplatir{jpg,000000,85}|image_select{501,501,2000,2000}|image_aplatir{jpg,000000,50}
C'est un peu lourd d'écriture mais cela te permet au moins de tester le principe de ce que tu veux faire sans rien développer, et il sera alors temps de tout packager dans un filtre quand le principe sera bien rôdé.
Cédric