Retailler des photos

June 7, 2010 by nono
Catégories geekeries - Mots-clés ImageMagick photos

Retailler des photos, c'est facile. Un p'tit coup de convert ou de mogrify et c'est tout bon.

Sauf qu'en vrai, c'est un peu moins évident que ça. Il leur manque une fonctionnalité élémentaire : un critère sur la taille du fichier obtenu (en gros, un mogrify -geometry 800x800 -max-filesize 200K). C'est dommage, j'en aurais bien l'utilité pour publier des photos sur certain site web. Du coup, j'ai bricolé en vitesse un petit bout de fonction zsh pour retailler des photos en 800x800, 200 Ko maximum.

Il y a plein de trucs codés en dur dedans et on sent bien mes restes de programmation de mon enfance, mais ça marche à peu près. ;-)

## Retaillage en 800x800, 200 Ko pour PentaxOne
resize4p1 () {
    if [[ $# -ne 1 ]]
    then
	echo "usage: resize4p1 source.jpeg"
	return 1
    fi
    source=$1
    dest=$(basename $source .jpeg).small.jpeg
    if [[ ! -f $source ]]
    then
	echo "E: Source file ${source} does not exist."
	return 1
    fi
    if [[ -f $dest ]]
    then
	echo "E: Destination file ${dest} already exists."
	return 1
    fi

    # Premiere passe en dur, pas beau mais initialise le "until" comme il faut.
    echo -n "Quality 100 ... "
    convert -antialias -geometry 800x800 -quality 100 $source $dest
    filesize=$(du -sk $dest | awk '{ print $1 }')
    echo "done -- file size is $filesize KB."

    q=99
    until [[ $filesize -lt 200 ]]
    do
	echo -n "Quality $q  ... "
	convert -antialias -geometry 800x800 -quality $q $source $dest
	filesize=$(du -sk $dest | awk '{ print $1 }')
	echo "done -- file size is $filesize KB."
	q=$(($q - 1))
	if [[ $q -lt 1 ]]
	then
	    echo "E: Quality 1 is not small enough -- unexpected error."
	    return 1
	fi
    done
}