L'anatomie de la ligne de commande
L'anatomie de la ligne de commande • Nom de fichier d'entrée • Options de la ligne de commande • Nom de fichier de sortie
Les outils en ligne de commande d'ImageMagick peuvent être aussi simples que ceci :
magick image.jpg image.png
Ou ils peuvent être complexes, avec une multitude d'options, comme dans l'exemple suivant :
magick label.gif -alpha Set \
\( +clone -shade 110x90 -normalize -negate +clone -compose Plus -composite \) \
\( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -alpha Off \) \
-delete 0 +swap -compose Multiply -composite button.gif
Cette commande d'exemple est suffisamment longue pour devoir être écrite sur plusieurs lignes ; nous l'avons donc mise en forme pour plus de clarté en insérant des barres obliques inverses (). La barre oblique inverse est le caractère de continuation de ligne sous Linux. Dans le shell Windows, utilisez un accent circonflexe (^) pour la continuation de ligne. Sur ces pages web, nous utilisons le style Linux, comme ci-dessus. Parfois, cependant, les lignes sont repliées par votre navigateur si la fenêtre du navigateur est suffisamment petite, mais les lignes de commande, affichées en blanc, sont malgré tout destinées à être saisies sur une seule ligne. Les caractères de continuation de ligne n'ont pas besoin d'être saisis. Les parenthèses échappées ci-dessus à l'aide de la barre oblique inverse ne sont pas échappées sous Windows. Il existe d'autres différences entre Windows et Linux (concernant les guillemets, par exemple), mais nous aborderons certaines de ces questions plus tard, au fur et à mesure qu'elles se présenteront.
Pour la plupart des exemples de ligne de commande de ce site, s'il existe une traduction équivalente à exécuter sous Windows, un menu déroulant apparaîtra en bas à droite, vous permettant de choisir pour quel système d'exploitation vous prévisualisez la commande.
Sans en savoir beaucoup sur la ligne de commande d'ImageMagick, vous pouvez probablement deviner que la première commande ci-dessus convertit une image au format JPEG en une image au format PNG. Cependant, très peu de gens réaliseront que la seconde commande, plus complexe, donne à une étiquette plate en deux dimensions un aspect tridimensionnel avec de riches textures et une profondeur simulée :
Ici, nous montrons le pourcentage d'achèvement d'une tâche sous la forme d'un cylindre ombré :

Étant donné la complexité du rendu, vous serez peut-être surpris d'apprendre qu'il est réalisé par une seule ligne de commande :
magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
-draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
-draw 'roundrectangle 264, 5, 304, 85 20,40' -tile gradient:chartreuse-green \
-draw 'roundrectangle 16, 5, 180, 85 20,40' -tile gradient:chartreuse1-chartreuse3 \
-draw 'roundrectangle 140, 5, 180, 85 20,40' +tile -fill none \
-draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
-draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
-shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
-strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
-shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
-append -background white -gravity center -extent 320x200 cylinder_shaded.png
Exécutez ce script proposé par Geemack. Vous aurez un aperçu de la puissance et de la polyvalence de la ligne de commande d'ImageMagick :
magick -background none -size 960x960 xc:black \( xc:darkred -duplicate 1 +append \) \
xc:gold \( xc:teal -duplicate 2 +append \) -modulate 100,100,"%[fx:rand()*200]" \
xc:white -scale x1 +append -write mpr:clut +delete radial-gradient: mpr:clut \
-clut -scale 100x4% -wave "%[fx:rand()*24+24]"x"%[fx:w/ceil(rand()*4+1)]" -extent "%[w]x%[w]" \
-roll +0+"%[fx:(rand()*w*0.05)+(w*0.51)]" \( +clone -blur 0x4 \) -insert 0 -composite \
-duplicate "%[fx:floor(rand()*3+3)*2-1]" -set option:rot "%[fx:180/n]" -virtual-pixel tile \
-virtual-pixel none -distort SRT "%[fx:t*360/n]" +repage -flatten -extent 100x50% \
\( +clone -rotate 180 \) -append +channel -virtual-pixel none -distort SRT "0.96 %[fx:rand()*360]" \
\( +clone -flop \) +repage -insert "%[fx:round(rand())]" -background black \
-flatten -brightness-contrast 20,20 -normalize dragonFire.png
Pour que le script puisse s'exécuter sous Windows, remplacez toute parenthèse précédée d'une barre oblique inverse (\() par une simple parenthèse, la barre oblique inverse (\) par ^, et doublez les signes de pourcentage (%).
Dans les sections suivantes, nous décortiquons l'anatomie de la ligne de commande d'ImageMagick. Espérons qu'après avoir lu attentivement et mieux compris le fonctionnement de la ligne de commande, vous serez en mesure d'accomplir des tâches complexes de traitement d'image sans recourir aux interfaces de programmation parfois intimidantes.
Consultez Examples of ImageMagick Usage pour une aide supplémentaire lors de l'utilisation d'ImageMagick en ligne de commande.
L'anatomie de la ligne de commande
La ligne de commande d'ImageMagick se compose de :
- un ou plusieurs noms de fichiers d'entrée obligatoires.
- zéro, un ou plusieurs réglages d'image (image settings).
- zéro, un ou plusieurs opérateurs d'image (image operators).
- zéro, un ou plusieurs opérateurs de séquence d'images (image sequence operators).
- zéro, une ou plusieurs piles d'images (image stacks).
- zéro ou un nom de fichier image de sortie (requis par magick, convert, composite, montage, compare, import, conjure).
Vous trouverez une explication détaillée de chacun des éléments constitutifs de la ligne de commande dans les sections qui suivent.
Nom de fichier d'entrée
ImageMagick étend la notion de nom de fichier d'entrée pour inclure :
- la globalisation des noms de fichiers (filename globbing)
- un format d'image explicite
- l'utilisation d'images et de motifs intégrés
- STDIN, STDOUT et les descripteurs de fichiers
- la sélection de certaines images (frames) d'une image
- la sélection d'une région d'une image
- forcer un redimensionnement d'image en ligne
- forcer un rognage d'image en ligne
- l'utilisation de références de noms de fichiers
Ces extensions sont expliquées dans les quelques paragraphes suivants.
Notez que, par défaut, si une option de ligne de commande est aussi un nom de fichier (par exemple, -quality), elle est interprétée comme un nom de fichier. Utilisez -define registry:option:pedantic=true pour l'interpréter plutôt comme une option.
Globalisation des noms de fichiers (Globbing)
Dans les shells Linux, certains caractères tels que l'astérisque (*) et le point d'interrogation (?) provoquent automagiquement la génération de listes de noms de fichiers à partir de correspondances de motifs. Cette fonctionnalité est connue sous le nom de globbing. ImageMagick prend en charge la globalisation des noms de fichiers pour les systèmes, tels que Windows, qui ne la prennent pas en charge nativement. Par exemple, supposons que vous vouliez convertir 1.jpg, 2.jpg, 3.jpg, 4.jpg et 5.jpg de votre répertoire courant en une animation GIF. Vous pouvez commodément faire référence à tous les fichiers JPEG avec cette commande :
magick *.jpg images.gif
Format d'image explicite
Les images sont stockées dans une myriade de formats d'image, dont les plus connus JPEG, PNG, TIFF et d'autres. ImageMagick doit connaître le format de l'image avant de pouvoir la lire et la traiter. La plupart des formats comportent une signature à l'intérieur de l'image qui identifie le format de manière unique. À défaut, ImageMagick s'appuie sur l'extension du nom de fichier pour déterminer le format. Par exemple, image.jpg ou image.JPG indique à ImageMagick qu'il lit une image au format JPEG.
Dans certains cas, l'image peut ne pas contenir de signature et/ou le nom de fichier n'identifie pas le format de l'image. Dans ces cas, un format d'image explicite doit être spécifié. Par exemple, supposons que notre image soit nommée image et contienne des valeurs d'intensité brutes de rouge, vert et bleu. ImageMagick n'a aucun moyen de déterminer automagiquement le format de l'image, nous en définissons donc un explicitement :
magick -size 640x480 -depth 8 rgb:image image.png
Images et motifs intégrés
ImageMagick dispose d'un certain nombre d'images et de motifs intégrés. Pour utiliser le motif en damier (checkerboard), par exemple, utilisez :
magick -size 640x480 pattern:checkerboard checkerboard.png
STDIN, STDOUT et les descripteurs de fichiers
Linux et Windows permettent de rediriger la sortie d'une commande vers l'entrée d'une autre. ImageMagick permet de lire et d'écrire des données d'image depuis et vers les flux standard STDIN (entrée standard) et STDOUT (sortie standard), respectivement, à l'aide du pseudo-nom de fichier -. Dans cet exemple, nous redirigeons la sortie de magick vers le programme display :
magick logo: gif:- | magick display gif:-
Le second format explicite "gif:" est facultatif dans l'exemple précédent. Le format d'image GIF possède une signature unique à l'intérieur de l'image, de sorte que la commande display d'ImageMagick peut aisément reconnaître le format comme étant GIF. Le programme magick accepte également STDIN comme entrée de cette manière :
magick rose: gif:- | magick - -resize "200%" bigrose.jpg'
D'autres tubes (pipes) sont accessibles via leurs descripteurs de fichiers (depuis la version 6.4.9-3). Les descripteurs de fichiers 0, 1 et 2 sont réservés respectivement aux flux standard STDIN, STDOUT et STDERR, mais un tube associé à un numéro de descripteur de fichier N>2 est accessible à l'aide du pseudonyme fd:N. (Les pseudonymes fd:0 et fd:1 peuvent être utilisés pour STDIN et STDOUT.) L'exemple suivant montre comment ajouter des données d'image redirigées depuis des fichiers ayant les descripteurs 3 et 4 et diriger le résultat vers le fichier ayant le numéro de descripteur 5.
magick fd:3 fd:4 -append fd:5
Au besoin, des formats d'image explicites peuvent être indiqués comme mentionné précédemment, comme dans l'exemple suivant.
magick gif:fd:3 jpg:fd:4 -append tif:fd:5
Sélection d'images (frames)
Certains formats d'image contiennent plus d'une image (frame). Vous ne voulez peut-être que la première image, ou la dernière, ou un certain nombre d'images intermédiaires. Vous pouvez spécifier les images à lire en ajoutant au nom de fichier de l'image la plage d'images entre crochets. Ici, notre image (un GIF animé) contient plus d'une image, mais nous ne voulons que la première :
magick 'images.gif[0]' image.png
Les shells Linux interprètent généralement les crochets, c'est pourquoi nous avons mis le nom de fichier entre guillemets ci-dessus. Dans un shell de commande Windows, les crochets ne sont pas interprétés, mais l'utilisation de guillemets ne fait pas de mal. Cependant, dans la plupart des cas, les rôles des guillemets simples et des guillemets doubles sont inversés entre Linux et Windows ; les utilisateurs de Windows devraient donc généralement essayer les guillemets doubles là où nous affichons des guillemets simples, et inversement.
Vous pouvez lire plus d'une image d'une séquence avec une plage d'images. Par exemple, vous pouvez extraire les quatre premières images d'une séquence d'images :
magick 'images.gif[0-3]' images.mng
Par défaut, l'avancement se fait image par image, de sorte que les images 0, 1, 2 et 3 sont renvoyées. Réglez le pas à 2 avec -define frames:step=2 et nous obtenons à la place les images 0 et 2.
Enfin, vous pouvez lire plus d'une image d'une séquence, dans le désordre. La commande suivante récupère la quatrième image de la séquence, suivie de la troisième, puis de la cinquième :
magick 'images.gif[3,2,4]' images.mng
Remarquez que dans les deux dernières commandes, une seule image est écrite. La sortie dans ce cas, où le type d'image est MNG, est un fichier multi-images car le format MNG prend en charge plusieurs images. Si le format de sortie avait été JPG, qui ne prend en charge que des images uniques, la sortie aurait consisté en des images séparées. Nous en reparlerons ci-dessous, dans la section sur le nom de fichier de sortie.
Sélection d'une région d'image
Les images brutes (raw) sont une suite d'intensités de couleur sans méta-informations supplémentaires telles que la largeur, la hauteur ou la signature de l'image. Avec les formats d'image bruts, vous devez spécifier la largeur et la hauteur de l'image, mais vous pouvez aussi spécifier une région de l'image à lire. Dans notre exemple, l'image est au format RGB brut 8 bits et mesure 6000 pixels de large sur 4000 pixels de haut. Cependant, nous ne voulons qu'une région de 600 sur 400 près du centre de l'image :
magick -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg
Vous pouvez obtenir le même résultat avec l'option -extract :
magick -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg
Redimensionnement d'image en ligne
Il est parfois commode de redimensionner les images à mesure qu'elles sont lues. Supposons que vous ayez des centaines de grandes images JPEG que vous vouliez convertir en une séquence de vignettes PNG :
magick '*.jpg' -resize 120x120 thumbnail%03d.png
Ici, toutes les images sont lues puis redimensionnées ensuite. Il est plus rapide et moins gourmand en ressources de redimensionner chaque image à mesure qu'elle est lue :
magick '*.jpg[120x120]' thumbnail%03d.png
Rognage d'image en ligne
Il est parfois commode de rogner les images à mesure qu'elles sont lues. Supposons que vous ayez des centaines de grandes images JPEG que vous vouliez convertir en une séquence de vignettes PNG :
magick '*.jpg' -crop 120x120+10+5 thumbnail%03d.png
Ici, toutes les images sont lues puis rognées ensuite. Il est plus rapide et moins gourmand en ressources de rogner chaque image à mesure qu'elle est lue :
magick '*.jpg[120x120+10+5]' thumbnail%03d.png
Références de noms de fichiers
Il existe deux méthodes pour utiliser un nom de fichier afin de référencer d'autres noms de fichiers image. La première utilise '@', qui lit les noms de fichiers image séparés par des espaces depuis le fichier spécifié. Supposons que le fichier myimages.txt contienne une liste de noms de fichiers, comme ceci :
frame001.jpg
frame002.jpg
frame003.jpg
Nous nous attendons alors à ce que cette commande :
magick @myimages.txt mymovie.gif
lise les images frame001.jpg, frame002.jpg et frame003.jpg et les convertisse en une séquence d'images GIF.
Si le chemin de l'image comporte un ou plusieurs espaces, mettez le chemin entre guillemets :
'my title.jpg'
Certaines options en ligne de commande d'ImageMagick peuvent dépasser les capacités de votre processeur de ligne de commande. Windows, par exemple, limite les lignes de commande à 8192 caractères. Si, par exemple, vous avez une option draw avec des points de polygone qui dépassent la limite de longueur de la ligne de commande, placez plutôt l'option draw dans un fichier et référencez le fichier avec le @ (par exemple @mypoly.txt).
Une autre méthode pour faire référence à d'autres fichiers image consiste à intégrer un caractère de formatage dans le nom de fichier avec une plage de scènes. Considérons le nom de fichier image-%d.jpg[1-5]. La commande
magick image-%d.jpg[1-5]
amène ImageMagick à tenter de lire les images portant ces noms de fichiers :
image-1.jpg
image-2.jpg
image-3.jpg
image-4.jpg
image-5.jpg
Mise en mémoire tampon du flux
Par défaut, le flux d'entrée est mis en mémoire tampon. Pour garantir que les informations du fichier source ou du terminal sont lues dès qu'elles sont disponibles, réglez la taille du tampon à 0 :
magick logo: gif:- | magick display -define stream:buffer-size=0 gif:-
Options de la ligne de commande
Vous pouvez diriger le comportement des utilitaires ImageMagick avec ces options en ligne de commande. Le comportement d'une option relève de l'une de ces catégories :
- Réglage d'image (Image Setting)
- Opérateur d'image (Image Operator)
- Opérateur de canal d'image (Image Channel Operator)
- Opérateur de séquence d'images (Image Sequence Operator)
- Géométrie d'image (Image Geometry)
- Pile d'images (Image Stack)
Réglage d'image (Image Setting)
Un réglage d'image persiste tel qu'il apparaît sur la ligne de commande et peut affecter le traitement ultérieur, comme la lecture d'une image, un opérateur d'image ou, le cas échéant, l'écriture d'une image. Un réglage d'image reste en vigueur jusqu'à ce qu'il soit réinitialisé ou que la ligne de commande se termine. Les réglages d'image incluent :
- • -adjoin
- • -affine
- • -alpha
- • -antialias
- • -authenticate
- • -background
- • -bias
- • -black-point-compensation
- • -blue-primary
- • -bordercolor
- • -caption
- • -channel
- • -comment
- • -compress
- • -debug
- • -define
- • -delay
- • -density
- • -depth
- • -direction
- • -display
- • -dispose
- • -dither
- • -encoding
- • -endian
- • -extract
- • -family
- • -fill
- • -filter
- • -font
- • -format
- • -fuzz
- • -geometry
- • -gravity
- • -green-primary
- • -interlace
- • -intent
- • -interpolate
- • -label
- • -limit
- • -linewidth
- • -log
- • -loop
- • -mattecolor
- • -monitor
- • -orient
- • -page
- • -pointsize
- • -preview
- • -quality
- • -quiet
- • -read-mask
- • -red-primary
- • -region
- • -render
- • -repage
- • -sampling-factor
- • -scene
- • -seed
- • -size
- • -stretch
- • -stroke
- • -strokewidth
- • -style
- • -texture
- • -tile
- • -transparent-color
- • -treedepth
- • -type
- • -undercolor
- • -units
- • -verbose
- • -virtual-pixel
- • -weight
- • -write-mask
Dans cet exemple, -channel s'applique à chacune des images puisque, comme nous l'avons mentionné, les réglages persistent :
magick -channel RGB wand.png wizard.png images.png
Opérateur d'image (Image Operator)
Un opérateur d'image diffère d'un réglage en ce qu'il affecte l'image immédiatement, telle qu'elle apparaît sur la ligne de commande. Un opérateur est toute option en ligne de commande non répertoriée comme réglage d'image ou comme opérateur de séquence d'images. Contrairement à un réglage d'image, qui persiste jusqu'à la fin de la ligne de commande, un opérateur est appliqué à l'ensemble d'images courant puis oublié. Les opérateurs d'image incluent :
- • -annotate
- • -black-threshold
- • -blur
- • -border
- • -charcoal
- • -chop
- • -clip
- • -clip-path
- • -clip-mask
- • -colors
- • -colorize
- • -colorspace
- • -color-threshold
- • -compose
- • -contrast
- • -convolve
- • -crop
- • -cycle
- • -despeckle
- • -draw
- • -edge
- • -emboss
- • -enhance
- • -equalize
- • -evaluate
- • -extent
- • -flip
- • -flop
- • -floodfill
- • -frame
- • -fx
- • -gamma
- • -gaussian-blur
- • -grayscale
- • -implode
- • -integral
- • -kmeans
- • -lat
- • -level
- • -map
- • -median
- • -modulate
- • -monochrome
- • -negate
- • -noise
- • -normalize
- • -opaque
- • -ordered-dither
- • -paint
- • -posterize
- • -raise
- • -profile
- • -random-threshold
- • -resample
- • -resize
- • -roll
- • -rotate
- • -rotational-blur
- • -sample
- • -scale
- • -sepia-tone
- • -segment
- • -shade
- • -shadow
- • -sharpen
- • -shave
- • -shear
- • -sigmoidal-contrast
- • -solarize
- • -splice
- • -spread
- • -strip
- • -swirl
- • -threshold
- • -transparent
- • -thumbnail
- • -tint
- • -transform
- • -trim
- • -unsharp
- • -version
- • -wave
- • -white-balance
- • -white-point
- • -white-threshold
Dans cet exemple, -negate inverse l'image wand mais pas l'image wizard :
magick wand.png -negate wizard.png images.png
Notez qu'un opérateur d'image sera appliqué à chaque image d'une séquence d'images. Par exemple, si vous utilisez l'option -resize pour redimensionner une image GIF, chaque image (frame) sera redimensionnée à la taille indiquée. Cependant, certaines images peuvent être plus petites que l'image entière, et redimensionner toutes les images à la même taille peut produire une sortie inattendue. Dans un tel cas, -coalesce doit être utilisé pour préparer ces images.
Opérateur de canal d'image (Image Channel Operator)
Opèrent directement sur les canaux d'image :
- • -channel-fx
- • -separate
Opérateur de séquence d'images (Image Sequence Operator)
Un opérateur de séquence d'images diffère d'un réglage en ce qu'il affecte une séquence d'images immédiatement, telle qu'elle apparaît sur la ligne de commande. Choisissez parmi ces opérateurs de séquence d'images :
- • -append
- • -affinity
- • -average
- • -clut
- • -coalesce
- • -combine
- • -compare
- • -complex
- • -composite
- • -copy
- • -crop
- • -debug
- • -deconstruct
- • -delete
- • -evaluate-sequence
- • -fft
- • -flatten
- • -fx
- • -hald-clut
- • -ift
- • -identify
- • -insert
- • -layers
- • -limit
- • -map
- • -maximum
- • -minimum
- • -morph
- • -mosaic
- • -optimize
- • -process
- • -quiet
- • -read
- • -swap
- • -write
Dans cet exemple, -append ajoute trois images en une seule :
magick mikayla.png picnic.png beach.png -append vacation.png
Géométrie d'image (Image Geometry)
De nombreuses options en ligne de commande prennent un argument de géométrie pour spécifier des éléments tels que la largeur et la hauteur souhaitées d'une image et d'autres grandeurs dimensionnelles. Parce que les utilisateurs veulent tant de variantes sur les dimensions, tailles et positions résultantes des images (et parce qu'ImageMagick souhaite les leur offrir), l'argument de géométrie peut prendre de nombreuses formes. Nous en décrivons beaucoup dans cette section.
Les options et réglages d'image qui prennent une forme d'argument de géométrie incluent les suivants. Gardez à l'esprit que certains d'entre eux interprètent leurs arguments de manières légèrement différentes. Consultez la documentation de l'option ou du réglage individuel pour plus de précisions.
- • -adaptive-resize
- • -border
- • -borderwidth
- • -chop
- • -crop
- • -density
- • -extent
- • -extract
- • -frame
- • -geometry
- • -iconGeometry
- • -liquid-rescale
- • -page
- • -region
- • -repage
- • -resize
- • -sample
- • -scale
- • -shave
- • -splice
- • -thumbnail
- • -window
L'argument de géométrie peut prendre l'une des formes répertoriées dans le tableau ci-dessous. Celles-ci seront décrites plus en détail dans les sous-sections suivant le tableau. La forme usuelle est size[offset], ce qui signifie que size est requis et offset est facultatif. Occasionnellement, [size]offset est possible. En aucun cas les espaces ne sont autorisés à l'intérieur de l'argument de géométrie.
| size | Description générale (le comportement réel peut varier selon les options et les réglages) |
|---|---|
| scale% | Hauteur et largeur toutes deux mises à l'échelle du pourcentage spécifié. |
| scale-x%xscale-y% | Hauteur et largeur mises à l'échelle individuellement par les pourcentages spécifiés. (Un seul symbole % est nécessaire.) |
| width | Largeur donnée, hauteur sélectionnée automagiquement pour préserver le rapport d'aspect. |
| xheight | Hauteur donnée, largeur sélectionnée automagiquement pour préserver le rapport d'aspect. |
| widthxheight | Valeurs maximales de hauteur et de largeur données, rapport d'aspect préservé. |
| widthxheight^ | Valeurs minimales de largeur et de hauteur données, rapport d'aspect préservé. |
| widthxheight! | Largeur et hauteur données de manière catégorique, rapport d'aspect d'origine ignoré. |
| widthxheight> | Réduit une image dont la ou les dimension(s) sont plus grandes que l'argument de largeur et/ou de hauteur correspondant. |
| widthxheight< | Agrandit une image dont la ou les dimension(s) sont plus petites que l'argument de largeur et/ou de hauteur correspondant. |
| area@ | Redimensionne l'image pour qu'elle ait l'aire spécifiée en pixels. Le rapport d'aspect est préservé. |
| x:y^ | supprime des lignes ou des colonnes pour atteindre le rapport d'aspect donné. |
| x:y# | ajoute des lignes ou des colonnes pour atteindre le rapport d'aspect donné. |
| {size}{offset} | Spécification de l'offset (la valeur par défaut est +0+0). Ci-dessous, {size} fait référence à l'une des formes ci-dessus. |
| {size}{+-}x{+-}y | Décalages horizontal et vertical x et y, spécifiés en pixels. Les signes sont requis pour les deux. Les offsets sont affectés par le réglage -gravity. Les offsets ne sont pas affectés par % ou les autres opérateurs de size. Notez que les offsets X et Y positifs sont dirigés vers l'intérieur, en direction du centre de l'image, pour toutes les options -gravity, sauf 'center'. Pour East, +X est vers la gauche. Pour South, +Y est vers le haut. Pour SouthEast, +X est vers la gauche et +Y est vers le haut. Pour center, la convention de direction X et Y normale est utilisée (+X est vers la droite et +Y est vers le bas). |
Ajustements de base de la largeur et de la hauteur ; les opérateurs %, ^ et !
Voici, juste en dessous, quelques exemples simples de géométrie, montrant comment elle peut être utilisée comme argument de l'option -resize. Nous utiliserons l'image interne logo: comme image d'entrée. Cette belle image mesure 640 pixels de large sur 480 pixels de haut. Nous disons que ses dimensions sont 640x480. Lorsque nous donnons les dimensions d'une image, la largeur (la dimension horizontale) précède toujours la hauteur (la dimension verticale). Cela sera vrai lorsque nous parlerons de coordonnées ou d'offsets dans une image, qui seront toujours la valeur x suivie de la valeur y. Pensez simplement à vos cours d'algèbre au lycée et au plan xy. (Enfin, presque : notre axe des y ira toujours vers le bas !)
magick logo: -resize '200%' bigWiz.png
magick logo: -resize '200x50%' longShortWiz.png
magick logo: -resize '100x200' notThinWiz.png
magick logo: -resize '100x200^' biggerNotThinWiz.png
magick logo: -resize '100x200!' dochThinWiz.png
La première des quatre commandes est simple : elle étire à la fois la largeur et la hauteur de l'image d'entrée de 200% dans chaque direction ; elle agrandit le tout d'un facteur deux. La deuxième commande spécifie des pourcentages différents pour chaque direction, étirant la largeur à 200% et écrasant la hauteur à 50%. L'image résultante (dans cet exemple) a pour dimensions 1280x240. Remarquez qu'il n'est pas nécessaire de répéter le symbole de pourcentage ; les formes suivantes sont équivalentes : 200x50%, 200%x50, 200%x50%.
Par défaut, la largeur et la hauteur données dans un argument de géométrie sont des valeurs maximales, sauf si un pourcentage est spécifié. C'est-à-dire que l'image est agrandie ou réduite pour s'adapter aux valeurs de largeur et de hauteur spécifiées tout en conservant le rapport d'aspect (le rapport entre sa hauteur et sa largeur) de l'image. Par exemple, la troisième commande ci-dessus « tente » de fixer les dimensions à 100x200. Imaginez que l'on réduise progressivement l'image d'origine (qui fait 640x480), en gardant son rapport d'aspect constant, jusqu'à ce qu'elle s'insère juste dans un rectangle de 100x200. Comme l'image est plus longue que haute, elle s'y insérera lorsque sa largeur sera réduite à 100 pixels. Pour préserver le rapport d'aspect, la hauteur devra donc être (480/640)×100 pixels = 75 pixels, de sorte que les dimensions finales seront 100x75.
Remarquez que dans l'exemple précédent, au moins une des dimensions spécifiées sera atteinte (dans ce cas, la largeur, 100 pixels). L'image résultante s'insère parfaitement à l'intérieur de l'original. On peut faire exactement l'inverse en invoquant l'opérateur ^, comme dans le quatrième exemple ci-dessus. Dans ce cas, lorsque 100x200^ est donné comme argument, au moins une des dimensions sera de nouveau atteinte, mais cette fois l'image résultante peut contenir parfaitement l'original. Ici, l'argument de géométrie donne des valeurs minimales. Dans notre exemple, la hauteur deviendra 200 et la largeur sera mise à l'échelle pour préserver le rapport d'aspect, devenant (640/480)×200 pixels = 267 pixels. Avec l'opérateur ^, l'une de ces dimensions correspondra à la taille demandée, mais l'image débordera probablement des dimensions demandées pour préserver son rapport d'aspect. (La fonctionnalité ^ est nouvelle depuis IM 6.3.8-2.)
Nous constatons qu'ImageMagick est très doué pour préserver les rapports d'aspect des images, afin d'éviter la déformation de vos photos et images préférées. Mais vous pourriez réellement vouloir que les dimensions soient 100x200, étirant ainsi l'image. Dans ce cas, dites simplement à ImageMagick que vous le voulez vraiment (!) en ajoutant un opérateur point d'exclamation à la géométrie. Cela forcera la taille de l'image à être exactement celle que vous spécifiez. Ainsi, par exemple, si vous spécifiez 100x200! les dimensions deviendront exactement 100x200 (donnant un petit wizard allongé verticalement).
Limiter la largeur, la hauteur et l'aire ; les opérateurs >, < et @
Voici quelques exemples supplémentaires :
magick logo: -resize '100' wiz1.png
magick logo: -resize 'x200' wiz2.png
magick logo: -resize '100x200>' wiz3.png
magick logo: -resize '100x200<' wiz4.png
Si une seule dimension est donnée, elle est considérée comme la largeur. Lorsque seule la largeur est spécifiée, comme dans le premier exemple ci-dessus, la largeur est acceptée telle qu'elle est donnée et la hauteur est choisie pour conserver le rapport d'aspect de l'image d'entrée. De même, si seule la hauteur est spécifiée, comme dans le deuxième exemple ci-dessus, la hauteur est acceptée et la largeur est choisie pour conserver le rapport d'aspect.
Utilisez > pour réduire une image uniquement si sa ou ses dimension(s) sont plus grandes que les arguments de largeur et/ou de hauteur correspondants. Utilisez < pour agrandir une image uniquement si sa ou ses dimension(s) sont plus petites que les arguments de largeur et/ou de hauteur correspondants. Dans les deux cas, si un changement est effectué, le résultat est comme si l'opérateur > ou < n'était pas présent. Ainsi, dans le troisième exemple ci-dessus, nous avons spécifié 100x200> et la taille de l'image d'origine est 640x480, donc la taille de l'image est réduite comme si nous avions spécifié 100x200. En revanche, dans le quatrième exemple ci-dessus, il n'y aura aucun changement de taille.
Enfin, utilisez @ pour spécifier l'aire maximale en pixels d'une image, là encore en tentant de préserver le rapport d'aspect. (Les pixels ne prennent que des valeurs entières, une certaine approximation est donc toujours à l'œuvre.) Dans l'exemple suivant, une aire de 10000 pixels est demandée. Le fichier résultant a pour dimensions 115x86, ce qui fait 9890 pixels.
magick logo: -resize '10000@' wiz10000.png
Dans tous les exemples ci-dessus et ci-dessous, nous avons mis les arguments de géométrie entre guillemets. C'est facultatif dans de nombreux cas, mais pas toujours. Nous devons mettre les spécifications de géométrie entre guillemets lorsque nous utilisons < ou > afin d'empêcher ces caractères d'être interprétés par le shell comme une redirection de fichier. Sur les systèmes Windows, l'accent circonflexe ^ doit être entre guillemets, faute de quoi il est ignoré. Par sécurité, il vaut probablement mieux prendre l'habitude de mettre tous les arguments de géométrie entre guillemets, comme nous l'avons fait ici.
Offsets dans la géométrie
Voici quelques exemples pour illustrer l'utilisation des offsets dans les arguments de géométrie. Une utilisation typique des offsets se fait en conjonction avec l'option -region. Cette option permet à de nombreuses autres options de modifier les pixels à l'intérieur d'une sous-région rectangulaire spécifiée d'une image. À ce titre, il faut lui donner la largeur et la hauteur de cette région, ainsi qu'un offset dans l'image, qui est une paire de coordonnées indiquant l'emplacement de la région à l'intérieur de l'image plus grande. Ci-dessous, dans le premier exemple, nous spécifions une région de taille 100x200 à situer aux coordonnées xy x=10, y=20. Utilisons la notation algébrique habituelle (x,y)=(10,20), par commodité.
magick logo: -region '100x200+10+20' -negate wizNeg1.png
magick logo: -region '100x200-10+20' -negate wizNeg2.png
magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png
Notez que les offsets requièrent toujours des signes +/−. L'offset n'est en réalité pas un véritable emplacement dans l'image ; ses coordonnées doivent être ajoutées à un autre emplacement. Appelons cela l'emplacement courant (current location). Dans les deux premiers exemples ci-dessus, cependant, cet emplacement est le coin supérieur gauche de l'image, dont les coordonnées sont (0,0). (C'est la situation par défaut lorsqu'aucune autre directive n'est donnée pour la changer.) Le premier exemple ci-dessus place le coin supérieur gauche du rectangle 100x200 lui-même en (10,20).
Un offset négatif peut avoir du sens dans de nombreux cas. Dans le deuxième exemple ci-dessus, l'offset est (-10,20), spécifié par -10+20. Dans ce cas, seule la portion du rectangle (virtuel) obtenu qui se trouve à l'intérieur de l'image peut être inversée ; ici, cela équivaut à spécifier la géométrie comme 90x200+0+20.
Dans le troisième exemple ci-dessus, le réglage -gravity précède les autres et fixe l'emplacement courant dans l'image au centre même de l'image. Dans ce cas, c'est au pixel (320,240), puisque la taille de l'image est 640x480. Cela signifie que les offsets s'appliquent à cet emplacement, qui se trouve ainsi déplacé, dans ce cas, à (320-10,240+20)=(310,260). Mais la région 100x200 elle-même est affectée par le réglage -gravity, de sorte qu'au lieu d'affecter son coin supérieur gauche, c'est le centre propre de la région (situé à (+50,+100) en son sein) qui est déterminé. Par conséquent, le centre du rectangle 100x200 est déplacé à (310,260). Le coin supérieur gauche du rectangle inversé est désormais à (310-50,260-100)=(260,160).
Pile d'images (Image Stack)
À l'école, votre professeur vous permettait probablement de travailler les problèmes sur un brouillon, puis de recopier les résultats sur votre copie d'examen. Une pile d'images est similaire. Elle vous permet de travailler sur une image ou une séquence d'images de manière isolée, puis de réintroduire les résultats dans la ligne de commande. La pile d'images est délimitée par des parenthèses. Les opérateurs d'image n'affectent que les images de la pile courante. Par exemple, nous pouvons limiter la rotation de l'image à la seule image wizard de cette façon :
magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif
Remarquez encore une fois que les parenthèses sont échappées en les faisant précéder de barres obliques inverses. Ceci est requis sous Linux, où les parenthèses sont des caractères de shell spéciaux. La barre oblique inverse indique au shell de ne pas interpréter ces caractères, mais de les transmettre directement à la commande exécutée. N'échappez pas les parenthèses sous Windows. Chaque parenthèse (ou parenthèse échappée) doit avoir des espaces de chaque côté, comme dans l'exemple montré ci-dessus.
En plus des opérateurs d'image déjà abordés, les opérateurs d'image suivants sont particulièrement utiles lors du traitement d'images dans une pile d'images :
Les arguments de ces opérateurs sont des indices dans la séquence d'images par numéro, en commençant par zéro pour la première image, et ainsi de suite. Cependant, si vous donnez un indice négatif, les images sont indexées à partir de la fin (dernière image ajoutée). C'est-à-dire qu'un indice de -1 est la dernière image de la séquence d'images courante, -2 donne l'avant-dernière, et ainsi de suite.
Nom de fichier de sortie
ImageMagick étend la notion de nom de fichier de sortie pour inclure :
- un format d'image explicite
- l'écriture vers la sortie standard
- les références de noms de fichiers
Chacune de ces extensions est expliquée dans les quelques paragraphes suivants.
Au lieu d'un nom de fichier de sortie, utilisez -exit pour empêcher complètement toute écriture d'image.
Format d'image explicite
Les images peuvent être stockées dans une myriade de formats d'image, dont les plus connus JPEG, PNG, TIFF et d'autres. ImageMagick doit connaître le format souhaité de l'image avant qu'elle ne soit écrite. ImageMagick s'appuie sur l'extension du nom de fichier pour déterminer le format. Par exemple, image.jpg indique à ImageMagick d'écrire l'image au format JPEG. Dans certains cas, le nom de fichier n'identifie pas le format de l'image. Dans ces cas, l'image est écrite dans le format dans lequel elle a été lue à l'origine, sauf si un format d'image explicite est spécifié. Par exemple, supposons que nous voulions écrire notre image dans un fichier nommé image au format brut d'intensité rouge, vert et bleu :
magick image.jpg rgb:image
Sortie standard
Linux permet de rediriger la sortie d'une commande vers une autre. ImageMagick permet de rediriger une commande vers une autre avec un nom de fichier -. Dans cet exemple, nous redirigeons la sortie de magick vers le programme display :
magick logo: gif:- | magick display gif:-
Ici, le format explicite est facultatif. Le format d'image GIF possède une signature qui l'identifie de manière unique, de sorte qu'ImageMagick peut aisément reconnaître le format comme étant GIF.
Références de noms de fichiers
Facultativement, utilisez un caractère de formatage intégré pour écrire une liste d'images séquentielle. Supposons que notre nom de fichier de sortie soit image-%d.jpg et que notre liste d'images comprenne 3 images. Vous pouvez vous attendre à ce que ces fichiers image soient écrits :
image-0.jpg
image-1.jpg
image-2.jpg
Ou récupérez les propriétés de l'image pour modifier le nom de fichier de l'image. Par exemple, la commande
magick rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'
écrit une image avec ce nom de fichier :
rose-70x46.png
Enfin, pour convertir plusieurs images JPEG en pages PDF individuelles, utilisez :
magick *.jpg +adjoin page-%d.pdf
Utilisez -define filename:literal=true pour contourner l'interprétation des caractères de formatage intégrés et utiliser plutôt le nom de fichier littéralement.
Mise en mémoire tampon du flux
Par défaut, le flux de sortie est mis en mémoire tampon. Pour garantir que les informations apparaissent sur le fichier de destination ou le terminal dès qu'elles sont écrites, réglez la taille du tampon à 0 :
magick -define stream:buffer-size=0 logo: gif:- | magick display gif:-

