Sam & Max » image http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Pour vos thumbnails, ImageMagick à la rescousse 24 http://sametmax.com/pour-vos-thumbnails-imagemagick-a-la-rescousse/ http://sametmax.com/pour-vos-thumbnails-imagemagick-a-la-rescousse/#comments Sun, 01 Dec 2013 08:11:42 +0000 http://sametmax.com/?p=8141 ImageMagick est la solution de manipulation d'images la plus souple et versatile à disposition. Après pas mal de tests, Max en avait conclu qu'appeler la lib avec un bon subprocess était simplement plus rapide et donnait des résultats de meilleure qualité que d'utiliser PIL en Python ou GD en PHP.]]> ImageMagick est la solution de manipulation d’images la plus souple et versatile à disposition. Après pas mal de tests, Max en avait conclu qu’appeler la lib avec un bon subprocess était simplement plus rapide et donnait des résultats de meilleure qualité que d’utiliser PIL en Python ou GD en PHP.

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 :-)

]]>
http://sametmax.com/pour-vos-thumbnails-imagemagick-a-la-rescousse/feed/ 24