Et je peux vous dire qu’il en a fait des tests pour obtenir le thumbnail des nichons parfait. C’est un perfectionniste quand il s’agit des tétons.
En général, on trouve ImageMagick dans les dépôts. Par exemple, sous debian :
sudo apt-get install imagemagick
Mais il n’est pas rare que Max compile la bête histoire d’avoir la même version partout :
wget http://mirror.checkdomain.de/imagemagick/ImageMagick-6.8.7-4.tar.gz ; tar -xvf ImageMagick-6.8.7-4.tar.gz ; cd ImageMagick-6.8.7-4
./configure
make && make install
ln -s /usr/local/bin/convert /usr/bin/convert
ln -s /usr/local/bin/identify /usr/bin/identify
Après tout ça, vous aurez accès à plusieurs commandes, qui permettent des manipulations d’images diverses.
Par exemple, identify
permet de récupérer des informations sur l’image telles que le format, la profondeur des couleurs… Nous on l’utilise surtout pour récupérer la taille :
identify -format "%[fx:w],%[fx:h]" "chemin/vers/image"
On peut utiliser un wrapper tel que wand pour utiliser ça depuis Python. Mais il est très facile de se faire un wrapper vite fait à la main :
import envoy
from minibelt import normalize
class ImageMagicError(Exception):
def __init__(self, result, encoding):
msg = normalize(result.std_err.decode(encoding))
super(ImageMagicError, self).__init__(msg)
def size(img, encoding=sys.stdout.encoding):
r = envoy.run('identify -format "%[fx:w],%[fx:h]" "{}"'.format(img))
if r.status_code != 0:
raise ImageMagicError(r, encoding)
w, h = r.std_out.strip().split(',')
return int(w), int(h)
Notez que j’utilise minibelt et envoy (un wrapper pour subprocess), car je suis une grosse feignasse.
Pour faire un thumbnail, la recette est plus compliquée, car ImageMagick est à l’image, ce que Perl est à la programmation. There’s_more_than_one_way_to_do_it ©.
Au final, celui qui nous a donné le meilleur résultat en qualité est cette suite d’arcanes secrètes transmise d’oreille de druide à oreille de druide :
convert chemin/image/originale -thumbnail largeurxhauteur^ -gravity center -extent largeurxhauteur -quality 80 chemin/vers/resultat.jpg
Ceci va redimensionner l’image en conservant le ratio, et si le résultat n’est pas adaptée aux dimensions finales, va en découper une partie tout en préservant le centre de l’image. La sortie sera un jpg avec un taux de qualité de 80%.
Là encore, un petit wrapper ne fait pas de mal :
def thumb(img, width, heigth, output, crop=False, encoding=sys.stdout.encoding):
if crop:
if crop is True:
crop = 'center'
crop = "-gravity {} -extent {}x{}".format(crop, width, heigth)
else:
crop = ''
cmd = ("convert {img} -thumbnail {width}x{heigth}^ {crop} -quality 80 {output}").format(
img=img, width=width, heigth=heigth, crop=crop, output=output,
)
r = envoy.run(cmd)
if r.status_code != 0:
raise ImageMagicError(r, encoding)
return r
Bref, ce genre de petit bricolage est loin d’être propre, mais il s’est montré fort robuste et efficace au fil des années. Quand on fait des dizaines de milliers de screenshots de films de cul tous les jours, c’est important :-)
]]>