Prise en charge des images x2 ou plus dans les filtres images
Les filtres images reposent sur la fonction _image_valeurs_trans()
pour lire l'image source, qui se repose elle même sur la fonction taille_image()
pour lire la taille d'une image source.
Pour des raisons d'optimisation on avait choisi d'utiliser si possible la balise img
aves ses attributs width et height si possible plutot que le fichier
https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/filtres_images_lib_mini.php#L395
Du coup si en entrée on a une image HR dont le width et le height sont différents de la taille en pixel de l'image (ex image en 1200px de large qu'on affiche en 600px de large pour qu'elle soit jolie sur les écrans HD), les filtres images se vautrent en se basant sur la taille affichage plutôt que la taille réelle de l'image.
Un fix évident pout éviter le bug est donc
--- a/ecrire/inc/filtres_images_lib_mini.php
+++ b/ecrire/inc/filtres_images_lib_mini.php
@@ -390,9 +390,9 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
($find_in_path and $f = find_in_path($fichier) and $fichier = $f)
or @file_exists($f = $fichier)
) {
- // on passe la balise img a taille image qui exraira les attributs si possible
- // au lieu de faire un acces disque sur le fichier
- [$ret['hauteur'], $ret['largeur']] = taille_image($find_in_path ? $f : $img);
+ // on ne passe jamais la balise img qui est peut-être en x2 et à laquelle on ne peut pas faire confiance
+ // on lit directement les infos du fichier
+ [$ret['hauteur'], $ret['largeur']] = taille_image($f);
$date_src = @filemtime($f);
} elseif (
@file_exists($f = "$fichier.src")
mais il serait encore plus malin de récupérer la taille réelle ET la densité à laquelle l'image est affichée, de renseigner ça dans le tableau retourné par _image_valeurs_trans()
et de voir comment s'en servir ensuite.
Les questions que cela pose :
- quand l'image source est en densité différente de 1x, doit-on considérer que les tailles passées à filtres de reduction/recadrage sont des tailles affichées ou des tailles réelles sur l'image ?
- doit on produire en sortie une image avec la même densité qu'à l'origine ? (ce qui pourrait se faire automatiquement dans la fonction
_image_ecrire_tag()
https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/filtres_images_lib_mini.php#L1264 appelée en sortie de la plupart des filtres images