⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://usage.imagemagick.org/windows/index.html).

ImageMagick Examples -- Utilisation sous Windows

 [ Introduction](#intro)

Introduction

Quel est l'intérêt d'un script IM sur mon PC Windows ?

Les exemples suivants supposent essentiellement que vous exécutez IM sur un ordinateur de bureau Windows, sans doute relié à un réseau. Or il existe quantité de programmes de manipulation d'images tout prêts, tels qu'Adobe Photoshop, Paint Shop Pro de Corel, IrfanView (http://www.irfanview.com/) et même GIMP (http://www.gimp.org/). Alors pourquoi se donner la peine de traiter des images avec les programmes et les scripts en ligne de commande d'IM ? Le véritable avantage d'utiliser ImageMagick plutôt qu'une interface pilotée à la souris est que vous pouvez automatiser complètement les manipulations de routine, que ce soit pour des fichiers isolés ou pour des lots de fichiers. Des tâches telles que :

Conversion de format en masse
C'est ce que proposent bon nombre de programmes Windows, comme IrfanView. Cependant, la polyvalence d'IM en matière de formats d'image est inégalée. Vous pouvez par exemple magick toutes les pages d'un PDF en une série de JPEG (si GhostScript est installé sur votre ordinateur).
Réduction et prétraitement de photographies numériques
Lorsque vous intégrez des photographies numériques dans un document de traitement de texte, il est généralement conseillé d'en réduire la résolution, afin que le document s'imprime plus vite. Il en va de même si vous magick le document en PDF via un pilote d'imprimante PDF tel que FreePDF. Le prétraitement peut aussi comprendre des routines de correction des couleurs et d'objectif.

Placer votre logo sur un lot de photographies numériques

Appliquer une série d'opérations à un lot de photographies numériques
Après avoir mis au point une série d'étapes de travail à l'aide d'un programme piloté à la souris, vous pourriez souhaiter automatiser ces étapes pour un traitement de masse ultérieur. Cependant, les langages de script (comme l'Action Script d'Adobe) sont peu répandus dans les programmes de traitement d'images sous Windows.

Combiner plusieurs images en une image catalogue

Bien que certaines de ces tâches (surtout la réduction en masse) soient également proposées par d'autres logiciels gratuits (en particulier par le traitement par lots d'IrfanView), vous n'êtes jamais libre de choisir les étapes de traitement à appliquer : vous devez vous contenter de celles offertes par le programme. Par exemple, le traitement par lots d'IrfanView permet de placer une chaîne de texte sur un lot de photographies, mais pas un logo. Il permet aussi de modifier la valeur gamma, mais l'histogramme de la photographie ne peut pas être écrêté à ses extrémités (comme le fait "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" dans IM, voir Normalize et Contrast Stretch). Les scripts IM conviennent tout particulièrement à un usage productif dans le réseau d'une entreprise, car des scripts prêts à l'emploi peuvent être utilisés par n'importe qui — les utilisateurs finaux n'ont pas nécessairement à savoir ce qui se passe en coulisses. Les étapes standard d'un flux de travail sur les images peuvent ainsi être entièrement automatisées (et véritablement standardisées). Plusieurs des scripts présentés ci-après ont été conçus pour un usage productif dans notre petite entreprise (spécialisée dans la reconstitution d'accidents). Je ne suis ni un programmeur de scripts Windows exceptionnel, ni particulièrement familier des outils en ligne de commande d'IM. Il existe probablement des approches plus élégantes à certains des problèmes traités ci-après. Les points que je veux faire valoir sont les suivants :

  • démontrer quelques techniques de base de la programmation de scripts Windows avec les outils en ligne de commande d'IM.
  • prouver que l'usage de scripts fondés sur IM n'est ni de l'art pour l'art, ni un passe-temps académique.
  • montrer que les outils en ligne de commande d'IM peuvent faire un vrai travail dans un réseau local (et pas seulement sur des serveurs web).

Comme dans le reste des pages d'exemples d'IM, nous n'utiliserons que les outils en ligne de commande d'IM et laisserons de côté ses diverses interfaces de programmation. Les scripts sont destinés à s'exécuter au sein d'un réseau local où une lettre de lecteur est affectée à chaque lecteur réseau. La plupart des scripts sont destinés à être exécutés sur les postes clients de ce réseau ; peu visent le serveur (de fichiers) du réseau.

Environnements possibles pour les outils en ligne de commande d'IM

Sous Windows, les commandes IM simples s'exécutent généralement dans l'interpréteur de commandes Windows (un « shell DOS » lancé en démarrant cmd.exe). Pour des opérations complexes, réalisées dans une longue ligne de commande ou dans une série de lignes de commande, mieux vaut écrire un script. Pour une série de commandes simples, il s'agira très probablement d'un fichier batch DOS, exécuté dans l'interpréteur de commandes Windows. Cette approche a toutefois ses limites, car le jeu de commandes des fichiers batch est plutôt restreint comparé à celui des shells de commande UNIX courants. Pour exécuter IM sous Windows, vous disposez essentiellement des alternatives suivantes :

L'interpréteur de commandes Windows (« fenêtre DOS »)
Il s'exécute avec cmd.exe (mode 32 bits) sous Windows NT 4.0, Windows XP et versions ultérieures, et il est présent sur tout ordinateur Windows. Voir Utiliser le shell DOS et les fichiers batch, ainsi que la note particulière sur Le problème de Convert.
Cygwin
Un interpréteur de commandes de type bash (http://www.cygwin.com/). En utilisant ce shell, les exemples IM présentés dans le reste de cette section d'usage peuvent être exécutés exactement tels quels, car vous disposez d'un shell en ligne de commande de style UNIX. Voir Utiliser Cygwin ci-dessous.
Le Windows Script Host
Le Windows Script Host repose sur la technologie .COM. Il est présent sur tout ordinateur Windows contemporain et les scripts WSH sont bien plus puissants que de simples fichiers batch DOS. Le Windows Script Host offre plusieurs interfaces de programmation, VBScript (Visual Basic Script) et JScript (Java Script) étant les plus courantes. Les outils en ligne de commande d'IM peuvent être invoqués à l'aide des commandes de shell DOS Run ou Exec de l'objet Shell. Voir Visual Basic Script (VBS) ci-dessous.
Le Windows PowerShell
Le successeur bien plus puissant de l'ancien shell DOS, fondé sur la technologie .NET 2.0. PowerShell est livré avec Windows 7 et s'exécute avec powershell.exe. Il peut être téléchargé pour Windows XP et Vista sur le site web de Microsoft.

Exécuter des scripts efficacement

Supposons que vous disposiez d'un parfait script Windows (un fichier batch DOS, un VBScript ou autre) qui prend le(s) nom(s) du ou des fichier(s) d'entrée comme paramètre(s) de ligne de commande, effectue une manipulation et produit le résultat sous la forme d'une seule image ou d'une série d'images. Vous n'aimerez sûrement pas devoir démarrer un shell de commande DOS (ou une alternative) à chaque fois et fournir au script les noms de fichiers en les tapant. Pour éviter ces façons de procéder fastidieuses, vous pouvez essentiellement recourir au glisser-déposer ou à SendTo : avec le glisser-déposer, vous placez le fichier batch DOS ou le VBScript (ou autre) à un endroit facilement accessible, comme le bureau ou le répertoire qui contient les fichiers image à traiter. Vous sélectionnez ensuite les fichiers à traiter dans l'Explorateur Windows et vous les déposez simplement sur le fichier de script. Les noms de fichiers sont transmis au script comme paramètres de ligne de commande et peuvent être référencés dans le script. Autre possibilité : vous pouvez placer votre script (ou un lien vers celui-ci) dans le dossier SendTo. Les programmes de ce dossier apparaissent dans le menu contextuel de l'Explorateur Windows lorsqu'on fait un clic droit dans le volet des fichiers de l'Explorateur. Là encore, les noms des fichiers sélectionnés sont transmis au script comme paramètres de ligne de commande. Le dossier SendTo s'appelle SendTo. Son emplacement semble changer à chaque nouvelle version de Windows. Une méthode infaillible pour le trouver consiste à taper shell:sendto dans la boîte Exécuter.Sous Windows XP ou version ultérieure, une seule ligne de commande peut compter 8192 (= 2¹³) caractères. Ainsi, si vous invoquez un outil IM directement depuis la ligne de commande, soit directement, soit via un fichier batch qui nomme directement tous les fichiers nécessaires, vous ne rencontrerez guère cette limitation. Le glisser-déposer, en revanche, utilise la routine ExecShell, qui est limitée à des chaînes de « seulement » 2048 (= 2¹¹) caractères. Comme tous les fichiers sont transmis avec des noms de fichiers pleinement qualifiés (c'est-à-dire lecteur + chemin + nom), cela peut devenir un problème pour les fichiers batch et les VBScripts exécutés via WSH lorsque les noms de chemins deviennent trop longs. Cette erreur ne peut pas être correctement gérée par le script une fois survenue, car elle se produit avant que le script ne soit réellement exécuté. Sous Windows XP, la solution consiste généralement à placer les fichiers à un endroit où les noms de chemins sont plus courts.

Le problème de Convert

La routine d'installation Windows d'IM ajoute le répertoire des programmes d'IM au chemin de recherche, de sorte que vous pouvez appeler les outils en ligne de commande d'IM directement depuis l'invite de commande, sans fournir de nom de chemin. Par défaut, vous utiliserez magick comme outil en ligne de commande. Cependant, si vous choisissez les anciens noms de programmes, les noms des outils en ligne de commande d'IM sont plutôt peu spécifiques (par ex. convert, identify, compare ...), ce qui provoque des conflits de noms avec d'autres programmes. En particulier, convert est un outil système Windows, situé dans le répertoire système de Windows (c:\Windows\system32\convert.exe), qui convertit le système de fichiers FAT32 en NTFS désormais courant. Mais il existe aussi d'autres programmes nommés « convert.exe », par exemple l'utilitaire de conversion de rapports de Delphi.L'outil de magick FAT → NTFS a été livré pour la première fois avec Windows XP et a engendré un conflit de noms avec l'outil en ligne de commande « convert » d'IM. Comme le répertoire des programmes d'IM était ajouté à la fin du chemin de recherche DOS (c'est-à-dire la variable d'environnement PATH), l'outil système était trouvé en premier, et les simples appels à « magick » dans les anciens scripts n'étaient pas résolus correctement. Les versions actuelles du programme d'installation Windows d'IM placent toutefois le répertoire des programmes d'IM en tête du chemin de recherche, garantissant ainsi qu'en cas de noms conflictuels, l'outil en ligne de commande d'IM est généralement trouvé en premier. Cependant, d'autres utilitaires portant le même nom (par ex. le convertisseur de rapports de Delphi) se sont heurtés au même problème et ont opté pour la même solution, à savoir placer le chemin de leur programme en tête de la variable path, ce qui signifie que cette solution n'est pas infaillible : si Delphi est installé après IM, un simple appel de Convert invoquera l'outil de conversion de rapports, et non le Convert d'IM.L'introduction de l'outil Convert avec Windows XP a fait planter quantité d'anciens scripts. La solution courante était de renommer l'outil Convert d'IM en quelque chose d'autre, comme « IMconvert » (notez que vous ne pouvez pas renommer la commande système, car le prochain service pack de Windows la restaurerait probablement, en ignorant la version renommée). Cette solution, bien qu'inutile aujourd'hui, se trouve encore partout sur Internet. La meilleure solution pour éviter d'éventuels conflits de noms futurs est d'appeler les outils en ligne de commande d'IM par leur nom de chemin complet dans tout script. C'est-à-dire en stockant leur emplacement dans une variable ou une constante. Ainsi, tout fichier batch devrait commencer par des lignes du type

  SETLOCAL EnableDelayedExpansion
  SET IMCONV="%PROGRAMFILES%\ImageMagick\Convert"
  ...
  %IMCONV% -size 128x128 xc:white test.gif

Le code suppose qu'IM a été installé dans un dossier nommé « ImageMagick » sous le dossier des programmes, ce qui n'est pas le nom standard de son dossier d'installation. (Voir Installer ImageMagick sous Windows pour les détails.) %PROGRAMFILES% est une variable d'environnement qui se développe en le nom du répertoire des programmes, c'est-à-dire « Program Files » dans la version anglaise de Windows et « Programme » dans la version allemande. SETLOCAL limite la définition de nouvelles variables d'environnement (telles qu'IMCONV) à la portée du fichier batch. EnableDelayedExpansion n'est pas vraiment nécessaire ici, mais c'est une bonne habitude d'employer cette option chaque fois que vous utilisez SETLOCAL ; voir Recommandations pour la programmation batch pour les détails. Il existe des méthodes plus sophistiquées et infaillibles pour découvrir le dossier d'installation d'IM, qui seront traitées dans Édition, débogage et test des erreurs d'exécution. Le code VBScript équivalent ressemblerait à quelque chose comme

  Set wsh = WScript.CreateObject("WScript.Shell")
  IMconv = wsh.ExpandEnvironmentStrings("%PROGRAMFILES%") & "\ImageMagick\Convert"

Par souci de simplicité, nous n'emploierons pas ce code à chaque fois par la suite, mais vous devriez le garder à l'esprit comme une bonne habitude. Pour un bon résumé alternatif et des solutions à ce problème, voir Ron Savage: MS Windows and convert.exe.

Encodage des caractères

ImageMagick encode les chaînes en Unicode, plus précisément en UTF-8. À l'inverse, DOS utilise des pages de code pour encoder les caractères (le plus souvent sur 8 bits). Cela engendre des problèmes lorsqu'on écrit des chaînes dans les images, par exemple en travaillant avec 'label' ou '-title' : en utilisant des caractères non ASCII, les choses se passent mal avec l'approche naïve. Par exemple, pour tenter de créer un label avec des tréma allemands tels que 'ä', 'ö', 'ü', vous pouvez simplement utiliser ce qui suit sous Linux…

  magick label:äöü test.png

Mais cela ne créerait pas la chaîne voulue sous Windows. Vous pouvez toutefois lire une chaîne encodée en UTF-8 depuis un fichier texte :

  magick label:umlauts.txt test.png

et vous pouvez même créer ce fichier texte à l'aide d'« echo », à condition d'avoir au préalable basculé la page de code en UTF-8 :

  CHCP 65001
  ECHO äöü > umlauts.txt
  magick label:umlauts.txt test.png

Mais si vous voulez traiter la sortie d'une commande DOS, par exemple en essayant de titrer une planche-contact des JPEG contenus dans un certain répertoire avec le nom de ce répertoire, vous êtes en difficulté. Le passage à la page de code 65001 ne fonctionnera pas avec la plupart des commandes DOS, en particulier lorsqu'on parcourt des arborescences de répertoires. Et basculer la page de code entre, disons, 1252 (latin d'Europe occidentale) et 65001 dans un sens puis dans l'autre ne fonctionnera généralement pas non plus, ou du moins deviendra assez délicat. L'approche la plus sûre consiste à magick les chaînes au moment où elles sont nécessaires, à l'aide d'un programme externe en ligne de commande, tel qu'« Iconv.exe », un outil UNIX également disponible pour Windows. Téléchargez le fichier d'installation depuis SourgeForge et installez les fichiers dans le répertoire standard C:\Program Files\GnuWin32. Ensuite, videz la sortie de la commande DOS dans un fichier texte au sein de votre script et magick ce fichier en UTF-8 comme suit :

  CHCP 1252
  DIR /B äöü.jpg > temp.txt
  "C:\Program Files\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8 temp.txt > title.txt
  magick label:@title.txt äöü.jpg -append äöü_labelled.jpg

Les paramètres indiquent à Iconv de transcoder de l'ISO-8859-1 (page de code 1252) vers l'UTF-8. Iconv écrit sa sortie sur stdout, si bien que vous devez la rediriger vers un fichier pour l'utiliser avec 'label'. Notez qu'il est de toute façon recommandé de vider la sortie dans un fichier texte, car cela indique à ImageMagick d'interpréter le contenu du fichier littéralement, sans prendre la barre oblique inverse Windows (« \ ») pour un caractère d'échappement. Bien entendu, le code de l'exemple ci-dessus n'a pas grand sens tel qu'il est présenté ici à des fins de démonstration. Dans un fichier batch DOS concret, le nom de fichier sera probablement généré dans une boucle FOR. Un exemple pratique est donné plus bas (voir Traiter une arborescence de (sous-)répertoires par lots). Pour en savoir plus sur la gestion de l'UTF, consultez les autres exemples IM et les informations dans Gestion du texte au format Unicode ou UTF8.

Installer ImageMagick sous Windows

ImageMagick est en développement constant ; de nouvelles versions sont publiées à peu près une fois par mois. Il est fortement recommandé d'utiliser une version à jour d'IM, en particulier lorsqu'IM ne semble pas accomplir une tâche tout à fait comme vous l'attendez. Dans la plupart des cas, l'installation de la version actuelle résoudra le problème. Le programme d'installation de la version binaire actuelle se trouve à l'adresse https://imagemagick.org/script/binary-releases.php#windows.Vous pouvez également télécharger une version d'ImageMagick compatible HDRI (qualité en virgule flottante) et FFT (transformée de Fourier rapide) depuis le Astronomy and Astrophotography Blog. Par défaut, IM s'installe dans un répertoire de programmes appelé C:\Program Files\ImageMagick x.x.x-x, où « x.x.x-x » désigne son numéro de version. Par défaut, lors de la première installation d'IM, le programme d'installation propose d'étendre la variable d'environnement PATH (c'est-à-dire que « Add application path to your system path » est coché). Si vous oubliez de désinstaller les versions plus anciennes, vous vous retrouverez vite avec une jolie collection de diverses versions d'ImageMagick, chacune avec son extension de PATH correspondante.Dans notre bureau, nous avons donc pris l'habitude d'installer IM dans C:\Program Files\ImageMagick, en installant les nouvelles versions par-dessus les anciennes et en laissant la variable d'environnement PATH intacte. Nous n'avons rien trouvé à redire à cette façon de procéder après des années d'utilisation. Si vous voulez vraiment connaître le numéro de version d'IM, vous pouvez toujours appeler « convert -version », et un script à toute épreuve peut évaluer le numéro de version au cas où il dépendrait d'un certain numéro de version minimal. Voir la section « Édition, débogage et test des erreurs d'exécution » pour plus d'informations à ce sujet.ImageMagick écrit quelques clés de registre dans HKEY Local Machine\Software\ImageMagick. Si vous gérez plusieurs versions installées d'IM, la clé la plus importante est HKEY Local Machine\Software\ImageMagick\Current, où vous trouverez aussi le chemin vers les binaires d'IM, appelé BinPath. Vous pouvez interroger cette entrée de registre au début de tout script et ainsi déterminer le chemin du programme sans avoir à vous fier à la variable d'environnement PATH. Voir la section « Édition, débogage et test des erreurs d'exécution » pour plus d'informations à ce sujet.Le programme d'installation d'IM propose l'option d'installer un objet COM+ pour ImageMagick via l'option Install ImageMagickObject OLE Control for VBscript, Visual Basic, and WSH. L'option n'est pas cochée par défaut et l'installation de l'objet COM+ n'est nullement un prérequis pour utiliser IM dans un VBScript, comme cela sera démontré par la suite. De toute façon, vous ne devriez pas compter sur la présence de l'objet COM+ sur une machine cible d'un script autre que la vôtre.Lorsqu'on travaille avec des fichiers PostScript, ImageMagick s'appuie sur un autre programme, « Ghostscript », pour la lecture et la conversion des fichiers PostScript et PDF vers un format d'image qu'il peut utiliser. Autrement dit, pour lire de tels documents, Ghostscript doit être installé sur votre ordinateur. Sa dernière version peut être téléchargée sur SourceForge. L'ordre dans lequel vous installez GhostScript et ImageMagick n'a pas d'importance. Vous n'êtes pas obligé d'installer GhostScript avant ImageMagick, et ImageMagick fonctionnera parfaitement sans lui. Il n'est nécessaire que si vous voulez travailler avec des fichiers PostScript ou PDF. IM détermine l'emplacement de Ghostscript à l'exécution, en l'interrogeant depuis le registre.

Particularités et pièges

De façon assez exceptionnelle pour un programme Windows, IM permet d'écrire les images vers stdout et de les lire depuis stdin, et donc d'utiliser des pipes pour chaîner les tâches de traitement d'images. L'opération

  magick -size 128x128 xc:white gif:- | magick - test.gif

équivaut à

  magick -size 128x128 xc:white test.gif

Dans la première commande du pipe, l'opérateur moins indique à IM d'écrire l'image vers stdout, tandis que l'opérateur moins de la seconde commande du pipe indique à IM de lire l'image depuis stdin. Cette façon de procéder permet d'éviter l'usage explicite de fichiers temporaires. Elle est particulièrement utile lorsqu'une commande n'offre pas certaines opérations, par exemple le rognage :

  montage -tile 2x2 -geometry 400x300+60+60 1.png 2.png 3.png 4.png miff:- | magick - -trim montage.png

En conséquence de cette caractéristique, la sortie textuelle est généralement écrite vers stderr au lieu de stdout. Par exemple : si vous voulez rediriger la sortie textuelle de Compare vers un fichier texte, vous devrez écrire

  magick compare -metric PSNR 1.png 2.png dif_1_2.png 2>result.txt

Vous devez donc rediriger stderr (« 2> ») vers le fichier texte, et non stdout (« 1> » ou simplement « > »).

Obtenir de l'aide

Les options en ligne de commande sont abondamment documentées sur le site web d'IM, mais c'est la section Usage de son site web qui montre vraiment comment les faire fonctionner. Cette section du site est plutôt bien structurée, permettant une approche orientée problème de la tâche que vous souhaitez réaliser. La méthode expéditive consiste toutefois à faire une recherche Google sur cette section du site à propos de l'option en ligne de commande que vous avez en tête. Si vous voulez réaliser un montage de plusieurs images et vous renseigner sur l'option -tile, vous pourriez faire une recherche Google sur l'un ou l'autre de

et vous en découvrirez rapidement l'essentiel. Gardez simplement à l'esprit que cela révélera du code destiné à une application dans un environnement UNIX / LINUX, qui doit être légèrement adapté pour être appliqué sous Windows.Une autre source d'information très utile est le forum de discussion d'IM, à savoir le Discourse Server User Forum, que vous devriez ajouter aux signets / favoris de votre navigateur. En devenant membre, vous pourrez poser des questions, auxquelles des utilisateurs compétents répondent le plus souvent rapidement.

Programmes auxiliaires et alternatives

Oui, c'est vrai. Il existe certaines tâches que d'autres programmes accomplissent mieux qu'ImageMagick. Typiquement celles qui sont conçues en pensant à des formats spécifiques, plutôt qu'à la manipulation d'images générale que fournit ImageMagick.

  • IrfanView est probablement la visionneuse d'images la plus courante sous Windows, qui permet aussi quelques manipulations d'images de base.
  • Un programme à interface graphique comme Adobe Photoshop ou Gimp convient mieux à l'édition directe et au test d'étapes de manipulation d'images complexes.
  • Pour les manipulations sur l'en-tête EXIF des photographies numériques, Jhead et ExifTool sont plus polyvalents qu'ImageMagick.
  • L'extraction des flux JPEG depuis des PDF devrait se faire avec xPDF.
  • Le traitement vidéo devrait plutôt se faire avec VirtualDub, au mieux en combinaison avec AviSynth et son éditeur AvsP.

Cela ne veut pas dire qu'il faille ignorer ImageMagick pour de tels travaux d'image. Mais vous pouvez faire bien davantage en les combinant.


Utiliser Cygwin

Comme on l'a dit plus haut, ImageMagick a été conçu en pensant à UNIX et Linux ; l'approche la plus simple est donc sans doute d'installer un shell Bash sur votre système Windows et d'exécuter la variété de scripts IM déjà écrits pour ce système, par exemple les scripts de Fred Weinhaus. Cygwin fournit — selon les termes de ses développeurs — un « environnement de type Linux pour Windows ». Il se compose de tous les outils normalement disponibles dans le shell Linux. J'ai testé quelques-uns des scripts bash de Fred Weinhaus sous le shell Bash de Cygwin et je les ai trouvés pleinement fonctionnels. Au bas de la page racine du site web de Cygwin, vous trouverez un lien intitulé Install or update now!, qui télécharge un lanceur d'installation nommé Setup.exe. Lorsque vous démarrez ce programme, il propose une liste de sites miroirs. Après en avoir choisi un, la routine présente une arborescence des outils qu'elle va installer. La sélection standard me semble raisonnable, vous pouvez donc simplement poursuivre. La routine d'installation télécharge alors les paquets nécessaires et installe Cygwin sur votre ordinateur. Lors de l'installation, veillez à inclure le paquet « bc », qui n'est pas activé par défaut. Il peut être installé en option depuis le panneau d'installation de Cygwin. C'est un utilitaire de calcul en virgule flottante qui peut être vital dans les scripts IM, tels que ceux qu'utilise Fred Weinhaus.
Lorsque vous démarrez Cygwin, son shell Bash ressemble beaucoup à une boîte DOS, c'est-à-dire une fenêtre de texte à fond noir. Comme pour la fenêtre DOS, la police peut être choisie en cliquant sur le menu système de la fenêtre, situé à gauche dans la barre de titre. Les commandes de base sont les suivantes :
  • Vous changez de répertoire courant avec la commande CD, plus ou moins comme sous DOS. Cependant, la barre oblique inverse (« \ ») doit être remplacée par la barre oblique (« / »). On change aussi de lecteur avec CD, comme sous DOS. Ainsi, CD w: bascule vers le lecteur w:. Contrairement à un environnement Unix normal, les noms de chemins ne sont pas sensibles à la casse. Des caractères spéciaux, tels que les tréma, peuvent être utilisés. Pour certaines commandes, les noms de lecteurs doivent être transmis dans une syntaxe particulière, évitant les deux-points. Par exemple /cygdrive/w/test.
  • Cygwin lit la variable d'environnement PATH de Windows et définit son propre PATH en conséquence. Vous pouvez le vérifier en tapant echo $PATH dans le shell Bash. Note : contrairement à Windows, les noms des variables d'environnement sont sensibles à la casse, vous devez donc utiliser des majuscules en faisant référence à PATH.
  • Contrairement à Windows, le répertoire courant n'est pas dans le chemin de recherche par défaut ! Si par exemple le script shell « autolevel1 » réside dans W:\scripts, vous ne pouvez pas vous contenter de basculer dans ce répertoire pour appeler le script shell. Vous devez faire précéder le nom du script d'au moins un emplacement de répertoire minimal, comme ceci : ./autolevel1 (pour le script situé dans le répertoire courant). Ou du chemin complet du script, comme ceci /cygdrive/w/scripts.
  • Vous pouvez aussi ajouter explicitement ce répertoire de scripts au chemin de recherche à l'aide de PATH=$PATH:/cygdrive/w/scripts. Comme les deux-points servent de séparateur de chemins, vous devez utiliser cette nomenclature particulière, telle que /cygdrive/w/scripts au lieu de w:/scripts.

Cette description du shell Cygwin sera étoffée dans les futures versions de cette page. Pour l'instant, les informations ci-dessus devraient suffire à vous lancer.


Utiliser le shell DOS et les fichiers batch

Convertir les scripts : du shell UNIX au DOS Windows

Lorsque vous invoquez des commandes IM directement depuis le shell de commande DOS (à l'aide de cmd.exe), vous devez modifier les scripts présentés sur le site d'exemples d'IM (s'ils ne proviennent pas de cette section), car la plupart des exemples fournis (dans d'autres sections) sont généralement destinés à être exécutés dans un shell de commande UNIX ou LINUX. Pour les exécuter depuis un shell de commande DOS, vous devez effectuer les modifications suivantes :

  • Le plus souvent, les guillemets doubles '"' doivent être employés à la place des guillemets simples ''' afin que les arguments de la commande restent corrects. Attention aux guillemets à l'intérieur de guillemets, comme dans l'opérateur [-draw](https://imagemagick.org/command-line-options/#draw). Vous pouvez utiliser des guillemets simples à l'intérieur d'un argument DOS entre guillemets doubles, car ils sont transmis à IM pour traitement, et non traités par le script.
  • Les barres obliques inverses '\' apparaissant à la fin des lignes d'exemple montrées représentent une « continuation de ligne » qui rattache la ligne suivante à la même séquence de ligne de commande. Remplacez-les par le caractère '^' pour indiquer une continuation de ligne dans les fichiers batch DOS. Sous DOS, la ligne suivante devra en outre commencer par un espace ; toutefois, c'est une pratique assez standard, cela ne devrait donc pas poser grand problème. Vous pouvez aussi rassembler toutes les lignes sur une seule et supprimer ces barres obliques inverses, mais cela rend l'édition, et la lecture ultérieure de la commande, bien plus difficiles. Cette pratique n'est donc pas recommandée.
  • Tous les caractères réservés du shell qui ne sont pas entre guillemets doubles doivent être échappés avec un '^' (accent circonflexe) s'ils sont employés au sens littéral (c'est-à-dire sans remplir leur rôle habituel). Ces caractères réservés du shell sont : '&', '|', '(', ')', '<', '>', '^'. Cela signifie en particulier que :
    • Le caractère spécial '>' (utilisé pour la géométrie de redimensionnement) doit être échappé à l'aide de '^'. Par exemple « -resize 100x100^> »
    • De même, l'indicateur de « redimensionnement pour tenir à l'intérieur » '^' doit être doublé pour devenir '^^'.
  • Les barres obliques inverses d'échappement du shell UNIX '\' ne sont pas nécessaires pour échapper les parenthèses '()' ou les points d'exclamation '!'.
  • Sinon, les barres obliques inverses d'échappement du shell UNIX '\' devront être remplacées par un accent circonflexe '^', lorsqu'elles échappent des caractères tels que '<' et '>'.
    Par exemple : « -resize 100x100\> » deviendra « -resize 100x100^> ».
  • Dans les fichiers batch DOS, le caractère pourcentage '%' a lui aussi une signification particulière, car il fait référence aux paramètres de ligne de commande. Par exemple %1, %2, ... (dans le shell UNIX, un signe '$' est utilisé pour la même signification générale). Dans un fichier batch DOS, les signes pourcentage simples (tels qu'ils apparaissent dans la « commande FOR ») devront être doublés en '%%'. ImageMagick lui-même se contente généralement de vérifier si un signe pourcentage est présent, et ne se soucie pas qu'il y en ait plus d'un. Ainsi, sauf s'il fait partie d'un label ou d'une chaîne de commentaire, doubler tous les signes pourcentage ne nuit généralement pas.
  • Gardez à l'esprit que les noms de fichiers Windows peuvent contenir des caractères d'espacement. Les espaces peuvent aussi être utilisés sous UNIX, mais c'est moins courant. De tels noms de fichiers susceptibles de contenir des espaces doivent être encadrés de guillemets doubles "file name.jpg" ou "file name".jpg. Un nom de fichier transmis à un script ou un fichier batch via le glisser-déposer ou SendTo comme paramètre de ligne de commande nécessite une attention particulière, car il est transmis au script sans guillemets s'il ne contient pas d'espaces, et avec guillemets s'il en contient.
  • Les commentaires dans les scripts shell UNIX commencent par un '#' non protégé n'importe où dans une ligne et se poursuivent jusqu'à la fin de la ligne. Les réglages de couleur (tels que « #FF0000 » pour une couleur rouge) sont souvent placés entre guillemets pour supprimer cette signification particulière. Cette protection n'est pas nécessaire sous DOS, mais placer des guillemets doubles '"' autour ne pose pas de problème et devrait être conservé. Sous DOS, les commentaires ne peuvent apparaître qu'en début de ligne à l'aide d'un préfixe 'REM', '@REM' ou '::'. Ils se poursuivent eux aussi jusqu'à la fin de la ligne. C'est à vous de choisir la méthode de commentaire à employer. Cependant, de bons commentaires dans tout fichier batch sont toujours recommandés, afin que vous sachiez ce que la commande tente de faire à chaque étape lorsque vous reviendrez au script des mois ou des années plus tard. Cela facilite aussi grandement la tâche des autres pour comprendre. Tout script devrait commencer par un commentaire plus étoffé, expliquant ce que fait le script et comment il doit être utilisé. C'est simplement une bonne pratique de programmation.
  • Lors de l'exécution d'un fichier batch DOS, les commandes individuelles sont affichées (echo) par défaut. C'est-à-dire que les commandes s'affichent dans la boîte DOS de sortie. Sous UNIX, il faudrait au contraire ajouter une commande ou une option spéciale pour afficher ainsi les commandes en cours d'exécution. Vous pouvez désactiver cette sortie « echo » en commençant votre script par « @ECHO OFF ». Le commentaire de tête spécial « #!/path/to/shell » des scripts shell UNIX n'est pas nécessaire pour les fichiers batch DOS. Cette ligne peut donc être remplacée par la commande « @ECHO OFF » pour les fichiers batch DOS.

Par exemple, en suivant les règles ci-dessus, ce script shell UNIX…

  #!/bin/sh
  # Create a negated rose image and overlay a comment
  magick -background none -fill red -gravity center \
          -font Candice -size 140x92 caption:'A Rose by any Name' \
          \( rose: -negate -resize 200% \) +swap -composite \
          output.gif

deviendra quelque chose comme ceci en tant que fichier batch DOS Windows…

  @ECHO OFF
  :: Create a negated rose image and overlay a comment
  magick -background none -fill red -gravity center  ^
          -font "C:\path\to the\font\candice.ttf"  ^
          -size 140x92   caption:"A Rose by any Name"  ^
          ( rose: -negate -resize 200%% ) +swap -composite  ^
          C:\where\to\save\output.gif

J'ai écrit un convertisseur de base de script shell Linux vers fichier batch DOS à l'aide de SED (Streaming EDitor). SED est un programme de manipulation de fichiers texte UNIX / Linux courant, également disponible pour Windows à l'adresse http://sed.sourceforge.net/. De même qu'IM est un manipulateur d'images piloté par des commandes, SED est un éditeur piloté par des commandes. Le script SED cim.txt qui effectue les manipulations nécessaires ressemble à ceci (une fois dépouillé de tout commentaire) :

  s/'/\"/g
  s/%/%%/g
  s/\\\([()!]\)/\1/g
  s/\([&|<>]\)/^\1/g
  s/^[ ]*#/::/
  s/\(^.*\)\( #.*$\)/\2\n\1/
  s/\(.:.*\.[a-z,A-Z]*\)[ ]/\"\1\" /g
  s/\\[ ]*$/^/
  s/^[ ][ ]//

Vous pouvez télécharger la version entièrement commentée du fichier sed_script.zip. Si vous placez le script SED cim.txt dans le même dossier que le script shell Linux à convertir, vous lancez la conversion par :

  %programfiles%\GnuWin32\bin\SED -f  cim.txt linux.scr > windows.bat

Vous pouvez aussi lancer la conversion via SendTo ou le glisser-déposer à l'aide du fichier batch suivant :

SET SP=%programfiles%\GnuWin32\bin
%SP%\SED -f %SP%\cim.txt "%~1"> "%~dpn1.bat"

Ce fichier batch suppose que vous avez placé le script SED cim.txt dans le dossier de programme de SED. Il prend le nom de fichier du script shell Linux comme unique paramètre de ligne de commande et génère un fichier batch du même nom, mais avec l'extension '.bat', dans le même dossier. (La cryptique manipulation de nom de fichier « %~dpn1.bat » est expliquée dans la section suivante.) À noter : le script SED ci-dessus n'effectuera que les remplacements rudimentaires mentionnés plus haut. Il ne transformera pas des scripts shell Linux sophistiqués (comme ceux présentés sur le site web de Fred Weinhaus) en fichier batch équivalent !

Gestion des noms de fichiers dans les fichiers batch

Comme on l'a dit plus haut, IM est particulièrement utile lorsqu'on applique une séquence standard d'étapes de traitement à un fichier image. Dans un tel cas, le nom de fichier est transmis au script comme paramètre de ligne de commande, soit via le glisser-déposer, soit via SendTo. Avec ces techniques, le nom de fichier transmis au fichier batch DOS sera un nom de fichier pleinement qualifié, c'est-à-dire incluant le nom du lecteur et le chemin du répertoire. Vous pouvez le vérifier en déposant un fichier sur le fichier batch suivant :

ECHO Filename: %1
PAUSE

Grâce à l'instruction PAUSE, la boîte DOS reste ouverte jusqu'à ce que l'utilisateur appuie sur une touche, de sorte que vous pouvez inspecter le résultat. Essayez ce qui précède avec un nom de fichier qui contient des espaces et vous remarquerez que le nom de fichier sera encadré de guillemets doubles.Notez qu'ici et dans tous les exemples suivants, nous supposons que tout fichier réseau s'est vu attribuer une lettre de lecteur. En pratique, je n'ai jamais rien vu de différent dans un réseau commercial local. Lorsque vous travaillez avec des fichiers batch, vous ne devriez pas essayer de gérer des noms UNC : vous pourriez faire fonctionner votre batch, mais cela vous causera bien des tracas inutiles.Lorsqu'on utilise ce nom de fichier dans une ligne de commande Convert, ce comportement peut poser problème. Effectuons une simple conversion d'un format quelconque vers JPEG. Le code le plus élémentaire serait :

magick %1 %1.jpg
PAUSE

Cela produira un fichier JPEG (de qualité et de résolution standard) dans le même répertoire, suffixé d'une extension « .jpg » supplémentaire. Le code ci-dessus fonctionne sur tout nom de fichier, qu'il contienne des espaces ou non. Si vous voulez vous débarrasser de l'extension d'origine, les choses deviennent un peu plus délicates :

magick %1 "%~dpn1.jpg"
PAUSE

Le fichier batch ci-dessus manipule le nom de fichier à l'aide de l'opérateur ~ : %~1 développe %1 en retirant les guillemets qui l'entourent (")
%~f1 développe %1 en un nom de chemin pleinement qualifié
%~d1 développe %1 en une lettre de lecteur seulement
%~p1 développe %1 en un chemin seulement
%~n1 développe %1 en un nom de fichier seulement
%~x1 développe %1 en une extension de fichier seulement
Ces modificateurs peuvent être combinés, de sorte que « %~dpn1 » signifie « lecteur + chemin + nom sans extension ni guillemets d'encadrement ». Par conséquent, nous devons encadrer le nom de guillemets doubles, afin que le code fonctionne aussi pour les noms de fichiers contenant des espaces. (Si ce n'est pas le cas, les guillemets ne font pas de mal.) L'instruction PAUSE est à des fins de test uniquement et peut être supprimée dans le fichier batch final. Si vous voulez simplement tester votre code sans réellement invoquer IM, vous devriez écrire :
ECHO magick %1 "%~dpn1.jpg"
PAUSE

ce qui se contentera d'afficher le résultat de votre manipulation de chaîne.

Traiter plusieurs fichiers par lots

Boucles FOR

La commande DOS FOR peut servir à traiter une série de fichiers de façon similaire à ce qu'elle fait sous UNIX. Pour mettre à l'échelle de 50 % tous les fichiers JPEG du répertoire courant, vous pourriez taper la ligne suivante dans une boîte DOS :

  FOR %a in (*.jpg) DO magick %a -resize 50% small_%a

Notez que le signe pourcentage n'est pas doublé. Si toutefois vous placez cette commande dans un fichier batch, vous devrez la remplacer par

  FOR %%a in (*.jpg) DO magick %%a -resize 50%% small_%%a

Là encore, il est pratique de lancer cette opération en masse par le glisser-déposer ou SendTo, en transmettant un nom de fichier pleinement qualifié (ou un nom de dossier) à un fichier batch DOS éventuellement situé dans un autre répertoire (tel que shell:sendto). Dans ce cas, nous devrions faire du répertoire du fichier le répertoire courant lors de la première étape :

  %~d1
  CD "%~p1"
  MD small
  FOR %%a in (*.jpg) DO magick %%a -resize 50%% small\%%a
  PAUSE

Dans ce fichier batch, nous

  • changeons de lecteur en fournissant le nom du lecteur (d: ou autre)
  • faisons du dossier du fichier le répertoire courant
  • créons un sous-répertoire nommé « small »
  • mettons à l'échelle de 50 % tous les fichiers JPEG et plaçons ces versions réduites dans le nouveau sous-répertoire.

À noter : comme le tilde (~) libère le nom de fichier transmis comme paramètre de ligne de commande de tout guillemet d'encadrement éventuel, nous devons généralement encadrer de nouveau de guillemets le résultat d'une telle manipulation. Nous avons donc écrit CD "%~p1" dans l'exemple ci-dessus. Dans le cas de la commande CD, nous aurions même pu omettre les guillemets d'encadrement, car cette commande précise n'accepte qu'un seul paramètre et peut donc gérer les espaces sans guillemets d'encadrement.Faire du répertoire du fichier le répertoire courant lors de la première étape facilite un peu les étapes suivantes, car les références aux noms de fichiers deviennent un peu plus simples et plus courtes. Nous aurions toutefois pu aussi bien écrire :

  MD "%~dp1small"
  FOR %%a in ("%~dp1*.jpg") DO magick "%%a" -resize 50%% "%%~dpasmall\%%~nxa"
  PAUSE

Cela pourrait rendre les choses un peu plus courtes, mais aussi bien plus délicates. Notez que les modificateurs de nom de fichier fonctionnent aussi sur la variable de boucle For %%a. Note deux : la barre oblique inverse finale fait partie du nom de chemin. Il faut donc "%~dp1small" et non "%~dp1\small", ce qui ne rend pas le code plus lisible, en particulier dans le cas de "%%~dpasmall\%%~nxa".L'instruction FOR présente plusieurs limites et pièges. L'un d'eux est que vous n'exécutez fondamentalement qu'une seule commande après DO. Vous pouvez toutefois regrouper une série de commandes DOS entre parenthèses « ( », « ) » et exécuter ainsi une simple séquence de commandes :

  @ECHO OFF
  :: Lighten darker areas of all images in a directory
  %~d1
  CD "%~p1"
  FOR %%a in (*.jpg) DO (
    ECHO Processing file: "%%~nxa"
    magick %%a -blur 30 -negate %%a.miff
    magick composite %%a.miff %%a -compose overlay "%%~dpn1_light"%%~xa
    DEL %%a.miff
  )
  PAUSE

Ce fichier batch traitera toutes les images trouvées dans le répertoire transmis comme argument de ligne de commande. Il commence par flouter l'image d'origine et l'inverser, en stockant le résultat intermédiaire dans un fichier avec une extension « .miff » supplémentaire. Puis il superpose l'image d'origine à cette version modifiée, éclaircissant ainsi les sections plus sombres de l'image d'origine. Enfin, l'image intermédiaire est supprimée. Notez que dans ce qui précède, l'accent doit être mis sur la simple séquence de commandes : vous ne pouvez pas recourir à des sauts GOTO à l'intérieur du bloc. Si vous avez besoin d'un tel comportement, vous devez appeler un autre fichier batch depuis la boucle FOR :

  %~d1
  CD %~p1
  MD small
  FOR %%a in (*.jpg) DO CALL "%~dp0process" "%%~fa"

Où « process.bat » est le fichier batch qui effectue le travail réel et qui est situé dans le même répertoire que le fichier batch appelant. Le paramètre de ligne de commande 0 (« %0 ») est le nom du fichier batch lui-même, de sorte que « %~dp0process » appelle le fichier batch process.bat dans le même répertoire. L'instruction FOR fournit simplement le nom de fichier, qui est transformé en nom de fichier pleinement qualifié via « %~fa ». Dans le cas présent, le code du fichier batch process.bat serait le même que celui qui était placé entre les parenthèses dans l'exemple ci-dessus :

  magick %%1 -blur 30 -negate %%1.miff
  magick composite %%1.miff %%1 -compose overlay "%%~dpn1_light"%%~x1
  DEL %%1.miff

L'usage d'un fichier batch distinct offre toutefois toutes les possibilités (limitées) d'un fichier batch DOS. Cela ne fait aucune différence dans cet exemple, mais nous montrerons les avantages de cette approche plus loin. Si vous ne voulez pas vous encombrer de deux fichiers batch, vous pouvez faire en sorte que le script crée le second script process.bat (à l'aide d'ECHO), l'appelle depuis la boucle principale, puis le supprime une fois le travail terminé :

  ECHO magick %%1 -blur 30 -negate %%1.miff >%~dp0process.bat
  ECHO composite %%1.miff %%1 -compose overlay "%%~dpn1_light"%%~x1 >>%~dp0process.bat
  ECHO DEL %%1.miff >>%~dp0process.bat
  %~d1
  CD %~p1
  MD small
  FOR %%a in (*.jpg) DO CALL "%~dp0process" "%%~fa"
  DEL %~dp0process.bat

En utilisant la commande ECHO, nous devons échapper une seconde fois tous les caractères spéciaux DOS, en particulier le signe pourcentage. Et oui, IM aurait pu faire tout ce qui précède en une seule commande de traitement, supprimant le besoin de l'image intermédiaire « .miff », mais là n'est pas le propos de cet exemple.

Traiter une arborescence de (sous-)répertoires par lots

Il existe plusieurs techniques pour traiter tous les fichiers d'une arborescence de (sous-)répertoires. L'approche la plus simple consiste à utiliser l'indicateur « /R » dans l'instruction FOR pour lui faire parcourir en boucle tous les fichiers de tous les sous-répertoires situés sous le répertoire courant. Pour magick vers JPEG tous les fichiers TIFF de l'arborescence de sous-répertoires, il vous suffit donc de taper :

  FOR /R %%a IN (*.tif) DO imconv "%%~a" "%%~dpna.jpg"

Lorsqu'on utilise l'indicateur « /R », on parcourt toujours l'ensemble de l'arborescence de sous-répertoires, sans possibilité de trier ou de filtrer les fichiers. Dans l'exemple à venir, nous générerons des planches-contact photographiques pour tous les sous-répertoires et les placerons dans le répertoire racine. Cela offre un moyen simple d'effectuer une recherche visuelle d'une certaine photographie, semblable à l'aperçu de l'Explorateur Windows, mais sans avoir à réanalyser (opération chronophage) l'ensemble de l'arborescence de répertoires à chaque recherche. Pour commencer, nous abordons le problème à l'aide de deux fichiers batch, l'un effectuant la boucle et l'autre faisant le travail réel. Les planches-contact seront des fichiers JPEG de basse qualité nommés IDX_0001.jpg, IDX_0002.jpg, IDX_0003.jpg et ainsi de suite. Établissons d'abord la boucle :

  DEL IDX_????.JPG
  SET COUNT=0
  FOR /F "delims=" %%a in ('DIR /S /B /AD ^|FIND /I "Porsche" ^|SORT') DO CALL c.bat "%%a"
  DEL title.txt

La première ligne fait le ménage parmi les résultats des recherches précédentes. Dans la deuxième ligne, nous définissons la variable d'environnement COUNT, que nous utiliserons pour générer les noms de fichiers IDX_nnnn.JPG. Dans la troisième ligne, nous établissons une liste de tous les sous-répertoires via DIR /S /B /AD, extrayons les répertoires qui contiennent le mot « Porsche » (sans distinction de casse grâce à l'option /I) et trions cette liste filtrée. Le tri garantira que l'ordre numérique des fichiers IDX coïncidera avec l'ordre alphabétique des noms de chemins de répertoires. L'option "delims=" inhibera le comportement standard de troncature des lignes après le premier espace. En appelant le fichier batch C.BAT, nous encadrons le nom de chemin de guillemets pour garantir que les espaces sont traités correctement. Dans la dernière ligne, nous supprimons un fichier temporaire créé par le fichier batch C.BAT. Passons maintenant au travail réel :

  CHCP 1252
  DIR %1\*.jpg>nul || GOTO :EOF

  :: Generate IDX filename
  SET /A COUNT+=1
  SET TFILE=000%COUNT%
  SET TFILE=IDX_%TFILE:~-4%.jpg

  :: Generate title without bracketing quotes
  ECHO %~1>temp.txt
  "C:\Program Files\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8 temp.txt>title.txt

  montage -geometry 210x140+0+5 -tile 6x -title @title.txt %1\*.jpg -quality 30%% %TFILE%
  jhead -cl %1 %TFILE%

Dans la première ligne, nous basculons la page de code vers le latin d'Europe occidentale (ISO-8859-1). Dans la deuxième ligne, nous vérifions si le répertoire contient réellement des photographies et sautons le reste du batch dans le cas contraire. (Exécuter le reste du batch ne ferait en réalité aucun mal, car magick montage ne générerait simplement aucune sortie, mais le compte des fichiers IDX ne serait plus consécutif.) Depuis Windows XP, il existe un label de cible GoTo spécial :EOF qui permet de terminer l'exécution sans définir de label adéquat.Nous générons ensuite le nom de fichier « TFILE » du fichier index en incrémentant « COUNT », en préfixant quelques zéros de tête et en extrayant les 4 derniers caractères via %TFILE:~-4%, puis en concaténant le tout pour créer un nom de fichier de la forme « IDX_nnnn.jpg ». L'usage de l'instruction SET /A pour effectuer des calculs est expliqué plus loin dans Calculs à l'aide de SET. Dans les lignes suivantes, nous libérons le nom de chemin « PNAME » des guillemets et stockons le résultat dans le fichier intermédiaire « temp.txt », qui est transcodé en Unicode (UTF-8) à l'aide d'« Icon.exe » (voir « Encodage des caractères »). La chaîne Unicode stockée dans « title.txt » est ensuite lue par le Montage d'IM. Cela garantit que la chaîne est traitée littéralement, de sorte que nous n'avons pas à échapper les barres obliques inverses dans les noms de chemins Windows. Montage combine ensuite les photographies en rangées de six (-tile 6x) et les titre avec le nom de chemin. La planche-contact résultante fera 1260 pixels de large et est stockée avec une qualité JPG de 30 % afin de réduire les besoins de stockage. Dans la dernière ligne, nous utilisons le programme JHEAD pour écrire le nom de chemin dans le commentaire JPEG. Cela offre la possibilité de filtrer les planches-contact au sein de l'Explorateur Windows en recherchant du texte dans les fichiers pour certaines sous-chaînes du nom de fichier. Nous pouvons combiner les deux fichiers batch, en plaçant le code du « batch de travail » dans la boucle FOR :

  SETLOCAL EnableDelayedExpansion
  SET ICONV="%PROGRAMFILES%\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8
  CHCP 1252
  DEL IDX_????.JPG
  SET COUNT=0
  FOR /F "delims=" %%a in ('DIR /S /B /AD ^|FIND /I "Porsche" ^|SORT') DO (
    DIR "%%a\*.jpg">nul
    IF !ERRORLEVEL!==0 (
      SET /A COUNT+=1
      SET TFILE=000!COUNT!
      SET TFILE=IDX_!TFILE:~-4!.jpg
      ECHO %%a >temp.txt
      %ICONV% temp.txt>title.txt
      montage  -geometry 210x140+0+5 -tile 6x -title @title.txt "%%a\*.jpg" -quality 30%% !TFILE!
      jhead -cl %%a !TFILE!
    )
  )
  DEL temp.txt
  DEL title.txt

Fondamentalement, deux modifications doivent être apportées au code initial :

  • Nous devons activer l'expansion différée et faire référence aux variables d'environnement utilisées dans la boucle FOR en les encadrant de points d'exclamation au lieu de signes pourcentage.
  • Nous devons éviter l'instruction GOTO qui réinitialiserait le processeur de commandes.

Par défaut, les variables d'environnement au sein d'une boucle FOR ne sont pas évaluées à l'exécution. Au lieu de cela, le code est prétraité à l'aide de la liste donnée entre parenthèses. Une référence à %COUNT% au sein de la boucle FOR renvoie donc toujours la même valeur. Pour activer l'évaluation à l'exécution des variables d'environnement, vous devez activer l'expansion différée. Cela peut se faire en appelant le processeur de commandes via cmd /V:on ou en l'activant globalement dans le registre, à l'aide du fichier REG suivant :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
"DelayedExpansion"="1"

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"DelayedExpansion"="1"

Cependant, la version à toute épreuve consiste à définir cette option dans le batch lui-même à l'aide de SETLOCAL EnableDelayedExpansion, ce qui limitera aussi toute modification des variables d'environnement à la version courante du processeur de commandes, ce qui est probablement souhaité. Les références aux valeurs à l'exécution des variables d'environnement au sein de la boucle doivent désormais utiliser des points d'exclamation au lieu de signes pourcentage. L'usage d'instructions GOTO au sein d'une boucle FOR est une source possible d'erreurs très subtiles et devrait donc être évité. Dans notre batch, nous pouvons toutefois aisément remplacer le saut par une instruction IF encadrant le bloc de code contenant le code montage.

Traiter par lots un nombre quelconque de fichiers

Dans les fichiers batch DOS, seuls neuf paramètres de ligne de commande peuvent être adressés directement par %1 à %9. Dans les anciennes versions de Windows, vous ne pouviez contourner cette limitation que par la commande SHIFT, qui provoquait un décalage circulaire des paramètres de ligne de commande. Dans les versions plus récentes, les paramètres de ligne de commande peuvent être traités dans une boucle For :

  FOR %%i in (%*) DO ...

Cela nous permet de faire un Montage d'un nombre quelconque d'images transmises par glisser-déposer :

  @ECHO OFF
  SETLOCAL EnableDelayedExpansion
  %~d1
  CD "%~p1"
  DEL Files.txt   2>nul:
  DEL FSorted.txt 2>nul:
  FOR %%I in (%*) DO ECHO %%~nxI>>files.txt
  FOR /F "delims=" %%A in ('TYPE files.txt ^| Sort') Do (
  ECHO %%A>>fsorted.txt
  )
  SET MONTAGE=montage -tile 3x
  FOR /F "delims=" %%A in (FSorted.txt) Do (
  SET MONTAGE=!MONTAGE! %%A
  )
  SET MONTAGE=%MONTAGE% result%~x1
  %MONTAGE%
  DEL Files.txt
  DEL FSorted.txt

Le code ci-dessus suppose que les fichiers transmis comme paramètres de ligne de commande résident dans le même répertoire et doivent être montés selon l'ordre alphanumérique de leurs noms de fichiers. Cela aurait par exemple du sens pour un index de photographies numériques qui seraient ainsi ordonnées selon leur heure de prise de vue. Nous faisons d'abord du répertoire des fichiers le répertoire courant, ce qui simplifie grandement le code suivant. Nous vidons ensuite les noms de fichiers dans files.txt. Même si les fichiers ont été sélectionnés dans l'ordre alphabétique, nous ne pouvons pas nous fier au fait que cet ordre soit préservé lorsque les noms de fichiers sont transmis au script. Nous ordonnons donc les fichiers dans une deuxième étape de travail, en les vidant dans fsorted.txt. À partir de ce fichier, nous construisons ensuite la ligne de commande de Montage dans une autre boucle For. Le fichier de sortie de Montage utilise la même extension que le premier fichier d'entrée (%~x1). (En supposant que tous les fichiers partagent la même extension.) Notez que la commande Montage finale est simplement appelée en évaluant la variable d'environnement, c'est-à-dire %MONTAGE%.Comme on l'a dit dans , transmettre une grande quantité de fichiers avec de longs noms de fichiers (complets) peut vous causer des ennuis sous Windows XP, car la liste de paramètres de ShellExecute est limitée à 2048 caractères. Cette erreur ne peut pas être gérée par le fichier batch, car elle survient avant que le contrôle ne soit remis au fichier batch. Une solution possible fondée sur un script consiste à traiter tous les fichiers image du répertoire lorsqu'un seul fichier est transmis au batch :

 %~d1 & IF EXIST %1\* (CD %1) ELSE CD %~p1
 IF "%2"=="" (
 SET PATTERN=*.jpg
 ) ELSE (
 SET PATTERN=%*
 )
 FOR %%v IN (%PATTERN%) DO (...)

Dans la première ligne, nous vérifions si le second paramètre de ligne de commande est présent. Si c'est le cas, tous les paramètres de ligne de commande (%*) sont traités. Si un seul fichier est transmis au script, le motif est réglé sur tous les fichiers JPEG. Cette simple correspondance de motif exige que nous ayons changé pour le lecteur courant (via %~d1) et le dossier courant, c'est-à-dire

  • CD %1 si un nom de dossier a été transmis au script
  • CD %p1 si un nom de fichier a été transmis au script.

Obtenir des informations depuis ImageMagick

Réutiliser la sortie d'une commande IM

Dans les versions récentes de Windows, l'instruction FOR est devenue bien plus puissante, voir DOS "For" Command Help. En utilisant l'option « /F », vous pouvez lire l'entrée de la variable de substitution depuis un fichier, une chaîne ou la sortie d'une autre commande DOS ou d'un autre programme. Cette dernière possibilité est particulièrement utile avec IM. Pour vous faire une idée approximative de ce que sont réellement les méthodes de superposition d'IM, vous pourriez utiliser le fichier batch suivant :

  @ECHO OFF
  :: compose two gradients using all compose methods available
  ::
  magick -size 80x80 -flip gradient: compose_src.png
  magick compose_src.png -rotate 90 compose_dst.png
  FOR /F %%A in ('magick -list compose') DO ^
     magick composite compose_src.png compose_dst.png -compose %%A compose_%%A.png

[IM Output]
Src | [IM Output]
Dst | | [IM Output]
Multiply | [IM Output]
Screen | [IM Output]
Overlay
---|---|---|---|---|---

Ce script compose ensemble deux images en dégradé, en utilisant chaque méthode de composition alpha possible, afin que vous puissiez voir comment les opérateurs affectent les couleurs de l'image. Seules certaines des images qu'il génère sont montrées ci-dessus. Cela ressemble aux images qui ont été générées pour les Composition Tables, afin que vous puissiez voir comment les opérateurs affectent les couleurs de l'image. Comme les lignes ci-dessus sont supposées constituer un fichier batch, nous devons doubler les signes pourcentage. Le script ci-dessus crée d'abord deux images orthogonales (alignées à angle droit) en niveaux de gris, avec des dégradés couvrant toute la plage des niveaux de gris. La commande IM Convert -list compose nous fournira une liste des options possibles, chacune placée sur une seule ligne de sortie. Notez que nous devons utiliser des guillemets simples en faisant référence à une commande entre parenthèses. En utilisant l'option « /F », la commande FOR traitera alors chacune de ces lignes de sortie et la transmettra à la commande exécutée par DO. En conséquence, les deux images en dégradé sont superposées en appliquant toutes les méthodes de superposition qu'IM connaît. Les fichiers de sortie sont nommés en correspondance avec la méthode de superposition. Dans l'exemple suivant, nous illustrons les espaces colorimétriques que fournit IM. Nous utilisons la même technique de dégradé que ci-dessus pour générer les faces d'un cube telles qu'engendrées par les trois coordonnées de l'espace colorimétrique :

magick -size 256x256 gradient: gy.miff
magick gy.miff -rotate 90 gx.miff
magick -size 256x256 xc:black black.miff

::R + G top left
magick gy.miff gx.miff -flop black.miff -set colorspace %1 -combine ^
        -resize 260x300! -background none -shear 0x-30 ^
        -virtual-pixel Transparent RG.miff

:: R + B top right
magick gy.miff  black.miff gx.miff -set colorspace %1 -combine ^
        -resize 260x300! -background none -shear 0x30 RB.miff

:: G + B bottom
magick black.miff gx.miff gy.miff -set colorspace %1 -combine ^
        -resize  260x300! -background none -shear 0x30 -rotate 120 ^
        -crop 520x300+0+75 GB.miff

magick -set colorspace %1 RG.miff RB.miff +append top.miff
magick -set colorspace %1 -size 520x150 xc:Transparent w.miff
magick top.miff w.miff -append topx.miff

composite -geometry +0+299 GB.miff  topx.miff colorspace_%1.png
DEL *.miff

[IM Output]
colorspace RGB | [IM Output]
colorspace sRGB
---|---
Un exemple similaire au précédent utilisant le scripting shell UNIX est donné dans Cube isométrique par cisaillement.

Ce fichier batch prend l'espace colorimétrique comme paramètre de ligne de commande « %1 ». Il génère ensuite les trois faces du cube et les cisaille puis les assemble de sorte que nous obtenons une vue isométrique, où le point (0,0,0) se trouve au centre d'un hexagone. L'image finale est nommée d'après l'espace colorimétrique (c'est-à-dire « %1 ») et stockée en PNG. Nous voulons maintenant appeler ce fichier batch (enregistré sous « cspace.bat ») depuis un autre fichier batch qui fournit les noms des espaces colorimétriques :

  FOR /F %%A in ('magick -list colorspace') DO CALL cspace %%A

Nous pouvons aussi filtrer la sortie de l'option -list en la faisant passer par un pipe sous DOS :

  magick -list colorspace | FIND "RGB" >>clist.txt
  FOR /F %%A in (clist.txt) DO CALL cspace %%A
  DEL clist.txt

Dans cet exemple, nous filtrons les lignes de la sortie qui contiennent « RGB » et les écrivons dans le fichier clist.txt. Ce fichier est ensuite utilisé comme entrée pour la commande FOR /F. Nous pouvons aussi faire cela d'un seul coup, en évitant le fichier temporaire :

  FOR /F %%A in ('magick -list colorspace ^| FIND "RGB"') DO CALL cspace %%A

Dans ce cas, le symbole de pipe « | » doit être échappé, car il n'est pas encadré de guillemets doubles (seulement des guillemets simples nécessaires à l'instruction FOR) et n'est pas (du moins dans la ligne de commande ci-dessus) employé dans son sens habituel.

Traiter une sortie sur une seule ligne

Cette technique peut aussi s'appliquer utilement à une sortie sur une seule ligne. Nous pouvons par exemple appliquer une correction gamma automatique qui règle approximativement la luminosité moyenne d'une image au milieu de la plage de quantum (c'est-à-dire 127 pour une profondeur de couleur de 8 bits) par une technique expliquée sur le site web de Fred Weinhaus :

  FOR /F %%a in ('identify -format "%%[fx:log(mean)/log(0.5)]" %1') DO ^
  magick %1 -gamma %%a "%~dpn1"_c.%~x1

Ce fichier batch reçoit un nom de fichier pleinement qualifié comme paramètre de ligne de commande « %1 », le plus probablement via le glisser-déposer ou SendTo. La sortie de la commande Identify d'IM fournit alors une valeur gamma, qui réglera la luminosité moyenne de l'image au milieu de sa plage dynamique. Cette valeur est calculée à l'aide d'une expression de format FX. La sortie sur une seule ligne de la commande Identify est enregistrée dans la variable « %%a », et transmise à la commande Convert comme argument pour l'opérateur Gamma. La commandeFOR semble assez sensible en ce qui concerne les continuations de ligne : si vous en utilisez, veillez à ne pas commencer la ligne suivante par des espaces.
Cette méthode de correction gamma automatique est désormais intégrée à IM à l'aide de « [-auto-gamma](https://imagemagick.org/command-line-options/#auto-gamma) », et a été ajoutée à IM v6.5.5-1. Mais elle illustre la technique de réutilisation de la sortie d'une commande pour l'employer dans les arguments d'une commande ultérieure.
--- ---
Avec la même technique FOR, nous pouvons lire les informations EXIF intégrées à une photographie et les écrire dans le coin supérieur gauche de l'image :
  FOR /F "tokens=1,2" %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize 18 -fill white -gravity northwest ^
    -annotate +0+0 "%%i %%j" "%~dpn1"_dated%~x1

| Les photos sont généralement enregistrées au format JPEG. Lire et réenregistrer des images JPEG entraîne une légère dégradation de l'image due à lacompression avec perte du JPEG, c'est pourquoi le réenregistrement en JPEG n'est pas recommandé.
---|---
Dans le fichier batch ci-dessus, le nom de fichier de la photographie est fourni comme unique paramètre de ligne de commande, auquel on fait référence par « %1 ». La commande Identify lit la date et l'heure de prise de la photographie depuis les informations EXIF contenues dans le fichier JPEG. La commande FOR transmet ensuite cette sortie à Convert qui annote la photographie en conséquence dans le coin supérieur gauche. Les informations EXIF de date et d'heure sont formatées comme « yyyy:mm:dd hh:mm:ss », par ex. « 2006:12:26 00:22:38 ». La date et l'heure sont donc séparées par un caractère d'espacement. Par défaut, l'instruction FOR ne trouverait que le premier token (« mot ») de chaque ligne, avec les caractères de tabulation et d'espace comme délimiteurs standard. Ainsi, dans l'exemple ci-dessus, le traitement standard ne renverrait que la date, mais pas l'heure. En utilisant l'option « tokens=1,2 », nous déclarons notre intérêt pour les deux tokens, qui sont nommés consécutivement, c.-à-d. « %x, %y ». Nous pouvons toutefois modifier le format plutôt inhabituel de la date à l'aide du code suivant :

  FOR /F "tokens=1,2,3,* delims=: " %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize 18 -fill white -gravity northwest ^
    -annotate +0+0 "%%j/%%k/%%i %%l" "%~dpn1"_dated%~x1

Nous avons maintenant défini le deux-points (« : ») comme délimiteur supplémentaire, ce qui provoque la décomposition de la date en trois tokens « %i », « %j », « %k ». Le délimiteur suivant trouvé est le caractère d'espacement séparant la date et l'heure. Avec l'astérisque (« * »), nous demandons que le reste de la ligne soit stocké dans le quatrième token « %l ». Nous pouvons maintenant formater la date comme bon nous semble. Nous avons choisi la notation anglo-américaine « mm/dd/yyyy » comme dans l'exemple ci-dessus.

Définir plusieurs valeurs à partir d'une seule commande

Une technique pour définir plusieurs valeurs à partir d'une seule commande ImageMagick consiste à faire formater les données par la commande, afin que vous puissiez définir plusieurs variables.

  FOR /F %%L IN ('identify -format "Width=%%w\nHeight=%%h" %1') DO set %%L

Cela aboutit à définir à la fois les variables DOS « Width » et « Height » à partir de l'unique appel de commande ImageMagick.

Effectuer des calculs

L'interpréteur de commandes DOS est médiocre en matière de calculs. Vous pouvez l'utiliser pour effectuer de l'arithmétique entière simple. Mais pour réaliser des calculs en virgule flottante plus complexes, vous avez accès à l'expression de format FX d'IM, ou à un programme de calcul DOS tiers.

Utiliser les expressions FX d'IM

L'expression de format FX d'IM peut servir aux calculs en virgule flottante et permet d'ajouter ce calcul à des chaînes formatées plus grandes, comme cela a été démontré ci-dessus dans le premier exemple de la section Traiter une sortie sur une seule ligne. À l'aide de la commande SET, le résultat peut être stocké dans une variable d'environnement et utilisé plus tard dans le fichier batch. Comme exemple simple, nous pourrions souhaiter ajuster la taille de police de la chaîne date-heure dans l'exemple ci-dessus en correspondance avec les dimensions de la photographie :

  FOR /F %%i IN ('identify -format "%%[fx:min(w,h)*0.05]" %1') DO SET psize=%%i

  FOR /F "tokens=1,2,3,* delims=: " %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize %psize% -fill white -gravity northwest ^
    -annotate +0+0 "%%j/%%k/%%i %%l" "%~dpn1"_dated%~x1

Dans la première ligne, nous évaluons la plus petite dimension de la photographie par « %[fx:min(w,h)] », en prenons 5 % et stockons cette valeur dans la variable d'environnement PSIZE. Cette valeur est référencée dans l'instruction suivante (%psize%) pour définir la taille de police de l'information heure-date. Et ici, nous calculons un angle aléatoire, entier compris entre -15° et +15°, pour créer une image miniature pivotée.

  FOR /F %%x IN ('magick null: -format "%%[fx:int(rand()*31)-15]" info:') DO SET angle=%%x
  magick %1 -thumbnail x90 -alpha set ^
            -background none -rotate %angle%   "%~dpn1"_rotated.png

Les expressions FX peuvent non seulement générer des nombres, mais aussi générer plusieurs nombres, intégrés dans une chaîne plus grande. Par exemple, dans Bordure à coins arrondis, elles ont servi à générer directement une chaîne de dessin complexe fondée sur les informations de largeur et de hauteur de l'image. Cette fonctionnalité supplémentaire, alliée au fait d'éviter toute dépendance supplémentaire envers d'autres programmes externes, fait de cette méthode une méthode préférable pour effectuer des calculs dans votre script batch.

Utiliser la commande SET

La commande SET peut effectuer quelques calculs entiers simples et quelques manipulations de chaînes de base lorsque l'option « /A » est invoquée. Dans l'exemple suivant, nous calculons approximativement la largeur de la chaîne heure-date à l'aide de la commande SET :

  :: Determine the font height
  FOR /F %%i IN ('identify -format "%%[fx:min(w,h)*0.05]" %1') DO SET psize=%%i

  :: The width of the date-time string is roughly 9 times its height
  SET /A pwidth=%psize% * 9

  :: Calculate the average brightness in this section
  :: and choose the text color correspondingly
  FOR /F %%i IN ('identify -format "%%[fx:mean]" -crop %pwidth%x%psize%+0+0 %1') DO SET mean=%%i
  IF %mean% LEQ 0.5 (SET fcolor=white) ELSE SET fcolor=black

  :: Annotate the photograph
  FOR /F "tokens=1,2,3,* delims=: " %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize %psize% -fill %fcolor% -gravity northwest ^
    -annotate +0+0 "%%j/%%k/%%i %%l" "%~dpn1"_dated%~x1

Cet exemple de fichier batch choisit la couleur de la chaîne heure-date en correspondance avec la luminosité moyenne (%mean%) dans la zone où elle sera placée. Si l'intensité colorimétrique moyenne est inférieure à 50 %, la chaîne sera blanche, sinon elle sera noire. L'exemple utilise aussi l'instruction IF. Notez que la partie ELSE doit être placée sur la même ligne et que la première commande doit être encadrée de parenthèses.

Utiliser d'autres calculateurs externes

En alternative, vous pouvez utiliser un programme DOS qui fournit des calculs en virgule flottante, tel qu'EVAL. Si vous placez ce fichier dans le répertoire des programmes d'IM ou dans le répertoire système de Windows, vous pouvez effectuer des calculs en virgule flottante dans n'importe quelle fenêtre de shell DOS. En utilisant le programme EVAL, la commande FOR et des variables d'environnement, nous pouvons rendre l'exemple du cube colorimétrique ci-dessus un peu plus flexible et ses divers calculs plus transparents :

  magick -size 256x256 gradient: gy.gif
  magick gy.gif -rotate 90 gx.gif
  magick -size 256x256 xc:black black.gif

  :: Set the dimension of the color cube / hexagon and calculate the various lengths
  SET l1=512
  FOR /F %%i IN ('EVAL "round(cos(degree*30)*%l1%)"') DO SET l2=%%i
  FOR /F %%i IN ('EVAL "2*%l2%"') DO SET l3=%%i
  FOR /F %%i IN ('EVAL "round((1+sin(degree*30))*%l1%/2)"') DO SET l4=%%i
  FOR /F %%i IN ('EVAL "round(%l1%/4)"') DO SET l5=%%i

  magick gy.gif gx.gif -flop black.gif -set colorspace %1 -combine ^
          -resize %l2%x%l1%! -background none -shear 0x-30 ^
          -virtual-pixel Transparent RG.miff

  magick gy.gif  black.gif gx.gif -set colorspace %1 -combine ^
          -resize %l2%x%l1%! -background none -shear 0x30 RB.miff

  magick black.gif gx.gif gy.gif -set colorspace %1 -combine ^
          -resize  %l2%x%l1%! -background none -shear 0x30 -rotate 120 ^
          -crop %l3%x%l1%+0+%l5% GB.miff

  magick -set colorspace %1 RG.miff RB.miff +append top.miff
  magick -set colorspace %1 -size %l3%x%l4% xc:Transparent w.miff
  magick top.miff w.miff -append topx.miff

  magick composite -geometry +0+%l1% GB.miff  topx.miff colorspace_%1.png
  DEL *.miff
  DEL *.gif

Édition, débogage et test des erreurs d'exécution

En principe, les fichiers batch DOS peuvent être écrits dans n'importe quel éditeur, même avec le Bloc-notes de Windows. Vous devriez toutefois utiliser un éditeur avec coloration syntaxique pour les fichiers batch DOS. Je pense personnellement que Notepad++ est l'outil de choix, mais parler d'éditeurs a tendance à rendre les gens désagréables. Donc : oui, n'importe quel autre éditeur fera l'affaire. Autant que je sache, il n'existe pas d'EDI (environnement de développement intégré) gratuit pour fichiers batch sur le marché. On pourrait penser que cela devrait être quelque chose de fourni avec le système d'exploitation, mais cela n'a jamais été le cas. Jusqu'ici, j'ai écrit tous mes fichiers batch avec Notepad++, mais pour ceux qui écrivent régulièrement des fichiers batch, l'EDI batch Running Steps pourrait être utile. C'est un partagiciel qui coûte environ 80 $. Des explications complètes sur les commandes DOS se trouvent à l'adresse http://www.computerhope.com/msdos.htm. Comme le langage batch DOS lui-même, le débogage des fichiers batch est une affaire plutôt étrange. Pour commencer, je testerais tout fichier batch dans une boîte DOS. Lorsqu'on teste le glisser-déposer ou SendTo, il est recommandé de terminer le fichier batch par une instruction PAUSE afin que la boîte DOS reste ouverte une fois la tâche batch terminée. Concernant les messages d'erreur d'exécution, l'approche générale consiste à vérifier l'ERRORLEVEL DOS et à sauter vers un message d'erreur correspondant généré par la commande ECHO. J'ai constaté que l'une des sources d'erreur les plus probables est que le programme Convert n'est pas correctement trouvé sur la machine qui exécute le script. Donc, si vous comptez partager vos scripts batch avec d'autres, vous devriez avant tout vérifier si Convert est accessible :

  @ECHO OFF
  magick -version 1>nul: 2>nul:
  IF NOT %errorlevel%==0 GOTO NoMagick:
  magick ...
  GOTO :EOF
  ...
  :NoMagick
  ECHO ImageMagick (convert.exe) not found.
  PAUSE

Dans la première ligne, nous interrogeons la version d'ImageMagick, en supprimant la sortie standard par 1>nul: (ou simplement >nul:) et tout message d'erreur par 2>nul:, c'est-à-dire que nous redirigeons _stdout_ et _stderr_ vers nul:. Si l'appel au Convert d'IM échoue, le programme système Convert sera appelé à la place, lequel ne peut pas gérer l'option -version et positionnera la variable ERRORLEVEL.Vous pourriez essayer de déterminer pourquoi Convert n'est pas trouvé et tenter de corriger le problème : vous pouvez déterminer si le chemin du programme d'IM fait partie de la variable d'environnement PATH :

  @ECHO OFF
  PATH | FIND /I "ImageMagick"
  IF NOT %errorlevel%==0 GOTO NoPath:
  ...
  :NoPath
  ...

Si Find (appelé avec l'option insensible à la casse /I) ne peut pas trouver la chaîne, il positionne l'ERRORLEVEL. Dans une approche plus sophistiquée, vous pouvez plutôt vérifier l'entrée de registre, sans plus vous fier à PATH :

  @ECHO OFF
  FOR /F "tokens=1,2,*" %%A in ^
  ('reg  query "HKCM\Software\ImageMagick\Current" ^| FIND "BinPath"') DO ^
  SET MPATH=%%C
  IF [%MPATH%]==[] GOTO NoMagick:
  "MPATH\convert.exe" ...
  ...
  :NoMagick
  ...

Avec ce code, nous interrogeons la clé de registre Current d'IM et recherchons l'entrée BinPath. La ligne décisive de la sortie est :LibPath REG_SZ C:\Program Files\ImageMagickLes « mots » de cette ligne de texte sont séparés par des tabulations (sous Windows XP) ou plusieurs espaces (Windows Vista). Ce sont les délimiteurs standard utilisés par For /F. Le troisième « mot » (%%C) est celui que nous recherchons et nous le stockons dans la variable d'environnement MPATH, à laquelle nous pourrons faire référence en appelant magick plus tard dans le script.Un script peut exiger qu'un certain numéro de version minimal d'ImageMagick soit installé. Par exemple, la méthode de distorsion en perspective a été implémentée pour la première fois dans la version 6.3.5-9 (en septembre 2007). Donc, si votre script traite de la rectification en perspective, vous devriez tester si la version installée d'IM est plus récente que celle-ci :

  @ECHO OFF
  SETLOCAL EnableDelayedExpansion
  SET MINVERSION=7.5.3-0
  FOR /F "tokens=1,2,3" %%a in ('magick -version ^|FIND "Version"') DO SET VERSION=%%c
  IF %VERSION% LSS %MINVERSION% GOTO GetNewVersion:
  Goto :EOF
  :GetNewVersion
  ECHO This Script requires et least ImageMagick version %MINVERSION%.
  ECHO Yours is %VERSION%.
  PAUSE
  Goto :EOF

SETLOCAL restreint toute modification des variables d'environnement au script courant, de sorte que nous n'avons pas à craindre d'effets de bord. L'option EnableDelayedExpansion n'est pas vraiment nécessaire ici, mais c'est une bonne habitude d'employer cette option chaque fois que vous utilisez SETLOCAL. Nous stockons ensuite la version minimale requise dans la variable d'environnement MINVERSION. Dans la troisième ligne, nous appelons Convert avec l'option '-version', extrayons la première ligne de la sortie via ^|FIND "Version", récupérons le troisième mot de cette ligne et le stockons dans la variable d'environnement VERSION. Dans la quatrième ligne, nous comparons cette version à la version minimale requise.

Optimiser le temps d'exécution

Pour mesurer le temps d'exécution, vous pouvez afficher le contenu de la variable d'environnement %TEMP%. Le script suivant teste diverses manières de calculer la luminosité moyenne d'un (gros) fichier image, disons une photographie numérique :

   IF "%1"=="" GOTO :EOF
   ECHO %TIME%
   Identify -verbose %1 | FIND "mean" & ECHO %TIME%
   copy %1 %TEMP%\*.* & ECHO %TIME%
   Identify -verbose %TEMP%\%1 | FIND "mean" & ECHO %TIME%
   Convert %TEMP%\%1  -format %%[fx:mean] info: & ECHO %TIME%
   Convert %TEMP%\%1 -resize 1x1! -format %%[fx:mean] info: & ECHO %TIME%
   DEL %TEMP%\%1

L'image est transmise au script comme unique paramètre de ligne de commande, testé dans la première ligne du script. Dans ce qui suit, le temps d'exécution des diverses approches est mesuré en affichant (echo) la variable d'environnement %TIME% avant et après l'instruction. L'esperluette & permet de placer plusieurs commandes DOS sur une seule ligne et sert simplement ici à réduire la place nécessaire au code. Si l'image est placée sur un lecteur réseau, le transfert vers la mémoire de l'ordinateur client peut consommer une part considérable du temps d'exécution. C'est pourquoi le fichier est copié dans le dossier temporaire local, dont le nom est stocké dans la variable d'environnement %TEMP%.Il s'avère que la simple commande Convert prend exactement autant de temps d'exécution que le filtrage du résultat d'Identify, mais que redimensionner l'image à un pixel via -resize 1x1! accélère significativement l'opération, sans trop en changer le résultat.Notez que nous utilisons ECHO %TIME% au lieu de TIME /T, car ce dernier n'affiche que les heures et les minutes, alors que le premier fournit les centièmes de seconde. Contrairement aux shells de commande UNIX, il n'existe pas de moyen direct de mesurer des temps relatifs, c'est-à-dire de fixer un point de référence, d'exécuter l'instruction, puis d'évaluer le temps nécessaire. Le calcul des temps relatifs au sein d'un fichier batch est rendu difficile par le fait que les fichiers batch n'autorisent que l'arithmétique entière. On peut extraire les secondes par la commande FOR, puis utiliser l'opérateur fx d'IM pour effectuer la soustraction, en tenant compte d'un débordement de 60 secondes

   FOR /F "tokens=1,2,* delims=:" %%a in ("%TIME%") DO SET START=%%c
        ... some command(s)...
        FOR /F "tokens=1,2,* delims=:" %%a in ("%TIME%") DO SET STOP=%%c
   Convert null: -format "%%[fx:(%STOP%-%START%<0.0)?%STOP%-%START%+60.0:%STOP%-%START%]" info:

Cela ne fonctionnera toutefois que sur les versions de Windows où le séparateur décimal est réglé sur le point décimal, car l'heure est fournie selon les paramètres régionaux et fx effectue ses calculs selon le schéma américain. Contrairement à VBScript, il n'existe aucun moyen de changer les paramètres régionaux au sein d'un fichier batch (autrement qu'en les changeant pour la machine entière via le registre).En alternative, on peut magick l'heure entière en centièmes de seconde, ce qui peut se faire en arithmétique entière, de même que le calcul ultérieur de toute différence. Le code de base est

   for /f "tokens=1-4 delims=:., " %%a in ("%TIME%") do ^
        set /a  Start100S=1%%a * 360000 + 1%%b * 6000 + 1%%c * 100 + 1%%d - 36610100

Le « 1 » inséré avant chaque partie du code de temps découpé empêche que les nombres à zéro de tête soient (mal) interprétés comme des octaux. L'« erreur de calcul » introduite par cette façon de procéder est ensuite compensée en soustrayant 36610100 à la fin. Le code d'exemple complet (et plus élégant) se trouve ici.Une autre approche est l'utilitaire TimeIt proposé par le Windows 2003 Resource Kit, qui peut être téléchargé ici. Officiellement, il ne prend toutefois en charge que Windows XP.

Recommandations pour la programmation batch

En résumé, voici les règles à suivre lorsqu'on programme des fichiers batch :

  • Commencer par SETLOCAL EnableDelayedExpansion
  • Définir une variable pour référencer l'outil Convert d'IM : SET IMCONV="%PROGRAMFILES%\ImageMagick"
  • Lorsqu'on travaille avec plusieurs fichiers, cela simplifie souvent le code de faire du dossier qui contient les fichiers le dossier courant, c'est-à-dire
    • changer de lecteur via %~d1
    • changer de dossier via CD %~p1
  • Utiliser iconv.exe de GnuTools pour magick le texte en UTF-8 et alimenter le texte depuis un fichier.
  • Garder à l'esprit que Convert et Montage écrivent leur sortie textuelle vers stderr, et non stdout.
  • Beaucoup d'erreurs proviennent de noms de fichiers contenant des espaces, alors vérifiez pour chaque batch s'il gère correctement de tels noms de fichiers.
  • N'oubliez pas de doubler chaque signe pourcentage, par ex. en réglant la qualité JPEG.
  • N'oubliez pas d'échapper les caractères spéciaux dans les chaînes, par ex. « ^| ».
  • Les calculs entiers effectués par SET /A traitent tout nombre commençant par zéro comme un octal, alors mettez un « 1 » devant chacun de ces nombres.

En résumé

Les exemples ci-dessus prouvent que le simple fichier batch DOS est étonnamment polyvalent lorsqu'il est combiné aux possibilités offertes par ImageMagick. De fait, presque tout peut se faire d'une manière (rudimentaire) ou d'une autre dans un fichier batch. Une fois qu'on s'est mis à penser selon les façons étranges suivies dans le développement du langage des fichiers batch DOS, les scripts peuvent même s'avérer plutôt courts. Néanmoins, ces quelques lignes de code auront probablement consommé des heures d'expériences fastidieuses, à moins que vous ne soyez vraiment familier du langage des fichiers batch. Si vous visez plus que des tâches de traitement d'images de base, il est probablement recommandé d'utiliser un langage de script plus sophistiqué, car le développement du code s'avérera plus simple et plus structuré.


Visual Basic Script (VBS)

Les capacités de scripting du Microsoft Windows Script Host (WSH) sont plus sophistiquées que celles du simple langage des fichiers batch. Le WSH est indépendant du langage, en ce sens qu'il peut utiliser différents moteurs de langages Active Scripting. Par défaut, il interprète et exécute des fichiers JScript en texte brut (Java Script) et des fichiers VBScript (VisualBasic Script). Le Windows Script Host est distribué et installé par défaut sous Windows 98 et versions ultérieures (il peut toutefois avoir été désactivé sur une machine cible éventuelle pour des raisons de sécurité). Le WSH implémente un modèle objet qui expose un ensemble d'interfaces COM permettant d'adresser les objets système, en particulier le système de fichiers. Nous ne discuterons pas le Windows Script Host en détail ici, car cela est fait ailleurs (et probablement mieux), mais donnerons plutôt quelques exemples pratiques de la manière d'aborder des problèmes typiques. Les exemples sont donnés en VisualBasic Script, mais le code JScript serait très ressemblant, il devrait donc être facile de réécrire les exemples en JScript, si c'est votre langage favori. Comme les fichiers batch, les VBScripts peuvent être écrits dans n'importe quel éditeur, et je suggérerais là encore Notepad++ comme éditeur de choix. Comme pour les fichiers batch, Microsoft n'offre aucun EDI taillé pour soutenir le développement des VBScripts. Il y avait un Microsoft Script Editor livré avec Microsoft Office 2000 à 2003, mais je ne l'ai jamais essayé. Microsoft fournit aussi le (très rudimentaire) Microsoft Script Debugger, mais là encore, je n'en ai pas grande expérience personnelle. Il existe plusieurs EDI VBS commerciaux proposés en partagiciel à des prix raisonnables, comme VbsEdit. Comme on l'a dit dans la section Installer ImageMagick sous Windows, nous n'utiliserons généralement pas l'interface COM+ d'ImageMagick par la suite. Les outils d'IM tels que Convert, Montage et Identify seront plutôt exécutés directement en invoquant la commande run du shell, avec toutes les options et tous les noms de fichiers nécessaires, à peu près de la même manière que dans les fichiers batch. En assemblant la chaîne de commande, nous tirerons toutefois parti des fonctionnalités offertes par un véritable langage de programmation.

Un exemple de base : la correction d'objectif

Comme l'usage du WSH engendre un certain surcoût, notre exemple de départ n'est pas trop élémentaire, afin de démontrer les avantages de VBScript par rapport à un simple fichier batch. Dans ce qui suit, nous corrigerons la distorsion d'objectif de l'appareil photo numérique Nikon 995 à l'aide de la distorsion en barillet d'IM. Le ou les paramètres de correction dépendent de la distance focale, qui est d'abord recherchée via magick identify. Pour la correction de l'objectif du Nikon 995, nous n'avons besoin que du paramètre b (c'est-à-dire a, c = 0), qui peut être calculé à partir de la distance focale f par : b = 0.000005142 f ³ - 0.000380839 f ² + 0.009606325 f - 0.075316854 Cette dépendance a été trouvée au moyen de la base de données lensfun qui répertorie les paramètres de distorsion en barillet de cet objectif. Voici donc notre VBScript :

  SetLocale(1033)          ' US, i.e. decimal point
  const strConv = "IMCONV" ' name of the IM Convert program
  const strAdd = "_pt"    ' string attached to the filename
  '
  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  ' names of the in- and output files
  strFileIn = WScript.Arguments(0)
  Pos = InStrRev(strFileIn,".")
  strFileOut = Left(strFileIn,Pos - 1) & strAdd & Mid(strFileIn, Pos)
  '
  ' evaluation of the focal length and calculation of parameter b
  command = "identify -format ""%[EXIF:FocalLength]"" """ & strFileIn & """"
  Set objExec = wsh.Exec(command)
  strf = objExec.StdOut.Readline
  f = eval(strf)
  b =  0.000005142 * f * f * f -0.000380839 * f * f + 0.009606325 * f  -0.075316854
 '
  Command = strConv & " """ & strFileIn _
    &  """ -virtual-pixel black -filter point -distort Barrel   ""0.0 " _
    & b & " 0.0 "" """ & strFileOut & """"
  wsh.run command,7,true

Dans la première ligne, nous réglons les paramètres régionaux sur l'anglais américain (1033), ce qui (entre autres) fixe le séparateur décimal au point décimal. Sinon, les valeurs décimales seraient présentées selon les paramètres régionaux, c'est-à-dire éventuellement avec une virgule décimale au lieu d'un point décimal, ce qui poserait problème lorsque de telles valeurs sont transmises à IM. Les deux lignes qui suivent la définition des constantes de chaîne sont un surcoût standard, car nous avons toujours besoin d'un objet Shell pour démarrer les programmes d'IM via ses méthodes Exec ou Run.L'unique argument du script est un nom de fichier, que nous fournissons généralement via le glisser-déposer ou SendTo. En nommant le fichier de sortie, nous ajoutons « pt » au nom de fichier d'origine, exactement comme le ferait PTlens, par ex. _Photo.JPG → Photo_pt.JPG. Le nom de fichier est stocké dans strFileIn, dont nous dérivons le nom du fichier de sortie strFileOut. Nous exécutons ensuite le programme Identify d'IM. Le résultat (c'est-à-dire le rationnel EXIF représentant la distance focale) est stocké dans strf. Les rationnels EXIF sont fournis sous forme de numérateur / dénominateur, par ex. 82 / 10 = 8,2 mm. Le rationnel doit donc être évalué avant d'être utilisé dans la formule qui calcule le paramètre b. Dans les deux dernières lignes, nous construisons la ligne de commande Convert et exécutons l'instruction via la méthode Run de l'objet Shell. Le paramètre 7 minimise la fenêtre et TRUE indique au script d'attendre le résultat. Le script ci-dessus esquisse la stratégie générale lorsqu'on utilise VBScript avec les outils en ligne de commande d'IM (et non l'objet COM+). Ceux-ci sont appelés soit

  • via la commande Run de l'objet Shell, si aucune sortie textuelle n'est attendue
  • via la commande Exec de l'objet Shell si une sortie textuelle doit être évaluée, comme c'est typiquement le cas avec Identify.

Ce premier VBScript ne fait rien qui n'aurait pu être fait au moyen d'un fichier batch comme

   SETLOCAL EnableDelayedExpansion
   FOR /F %%i in ('identify -format "%%[EXIF:FocalLength]" %1') DO SET FL=%%i
   FOR /F %%i IN ('Convert null: -format "%%[fx:0.000005142*(%FL%)^3 - 0.000380839 * (%FL%)^2 + 0.009606325 * %FL% - 0.075316854]" info:') DO SET B=%%i
   Convert %1 -distort barrel "0.0 !B! 0.0" "%~dpn1_pt%~x1"

mais le code VBS est plus direct, plus facile à modifier et peut aisément être étendu en matière de vérification d'erreurs et autres. Notez que les sauts de ligne dans la seconde instruction FOR sont impossibles, de sorte que nous devons la laisser aussi longue qu'elle est.

Travailler avec plusieurs fichiers

Un véritable avantage de VBScript par rapport aux fichiers batch DOS est que vous pouvez aisément parcourir en boucle un nombre quelconque d'arguments de ligne de commande. Vous pourriez par exemple sélectionner plusieurs fichiers dans l'Explorateur Windows et combiner les images sélectionnées en une planche-contact via le Montage d'IM. Le code de base serait :

  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  strInputFiles  = ""
  For EACH Arg IN WScript.Arguments
      strInputFiles = strInputFiles & " """ & Arg & """"
  next
 '
  IndexFile= Left(WScript.Arguments(1),InStrRev(WScript.Arguments(1),"\")) & "index.jpg"
  Command = "montage -geometry 210x140+0+5 -tile 6x " & strInputfiles & " -quality 80% """ & IndexFile & """"
  wsh.run command, 7, true

Le script concatène d'abord les noms de fichiers transmis au script via le glisser-déposer. Il dérive ensuite le nom d'un fichier JPEG de sortie dans le même dossier par quelques manipulations de chaînes simples. Enfin, Montage est appelé avec les paramètres appropriés. Pour des scripts plus grands, il est pratique de stocker les noms de fichiers dans un tableau :

  Dim FName()
  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  NArgs = WScript.Arguments.Count
  Redim FName(NArgs-1)
  FOR i = 0 TO NArgs - 1
    FName(i) = """" & WScript.Arguments(i) & """"
  NEXT

Nous définissons d'abord un tableau dynamique via Dim FName(), puis le redimensionnons via Redim FName(NArgs-1). La ligne de commande de Montage pourra devenir très longue, car dans la liste des fichiers d'entrée, chaque fichier est nommé par son nom de fichier pleinement qualifié. La longueur maximale n'est pas les 8192 caractères habituels, mais est déterminée par la longueur maximale autorisée pour un appel de la fonction ShellExecute, qui n'est que de 2048 caractères pour Windows XP. Cela peut poser problème lorsque le nom du répertoire est très long. L'erreur provoquée ne peut pas être gérée par le script, car elle survient avant que le script ne soit exécuté. Une solution possible est de placer les fichiers dans un dossier local au nom plus court. La solution (partielle) fondée sur un script est la même que pour les fichiers batch : si un seul nom de fichier est fourni, toutes les images du répertoire parent sont traitées. Pour traiter tous les GIF d'un dossier, nous pourrions faire quelque chose dans le genre de :

  Dim fs, folder
  Set fs = CreateObject("Scripting.FileSystemObject")
  If WScript.Arguments.Count <> 1 Then WScript.Quit(1)
  set Folder = fs.getFolder(fs.GetParentFoldername(WScript.Arguments(0)))
  FN=""
  FOR EACH file in folder.files
     If instr(file,"gif") <> 0 THEN FN = FN & File & vbLF
  NEXT
  MsgBox FN

Ici, nous utilisons l'objet FileSystem pour déterminer le nom du dossier parent. La correspondance de l'extension du fichier est toutefois vérifiée de la manière ordinaire, car l'objet Files n'offre à la place que la propriété Type.Bien souvent, les noms de fichiers devront être triés par ordre alphabétique, car le glisser-déposer ou SendTo les transmettra au script dans un ordre aléatoire. Cela peut se réaliser par un tri à bulles :

  for i = 0 to NArgs - 1
    for j = i + 1 to NArgs - 1
      if FName(i) > FName(j) then
        Temp = FName(i)
        FName(i) = FName(j)
        FName(j) = Temp
      end if
    next
  next

[clip] Une application plus sophistiquée du concept esquissé ci-dessus est présentée à droite : un ensemble d'images vidéo a été monté en deux « bandes de film » parallèles au moyen d'un VBScript et d'ImageMagick. Les perforations donnent un indice visuel que la progression des images va de haut en bas, c'est-à-dire colonne par colonne, contrairement au motif de lecture occidental habituel de gauche à droite puis de haut en bas. Le script entier qui accomplit la tâche peut être téléchargé depuis l'archive strip.zip. Note en marge : le code temporel rouge en haut à droite de chaque image a été généré par un script AVIsynth. Les images ont été extraites en les exportant depuis VirtualDub. Grâce au code temporel intégré, les images n'ont pas nécessairement à être temporellement équidistantes, c'est-à-dire qu'elles peuvent être choisies selon les besoins dans l'Explorateur Windows et envoyées au script, qui est placé dans le dossier SendTo.

Travailler avec des fichiers texte

Lorsqu'on travaille avec des scripts sur un ordinateur client, l'information d'entrée est généralement fournie via le glisser-déposer ou SendTo, c'est-à-dire qu'elle consiste essentiellement en des noms de fichiers qui seront traités d'une manière prédéfinie par le script. Toute information supplémentaire doit être fournie soit par une interaction de l'utilisateur à l'exécution, soit sous forme d'un fichier texte. Fondamentalement, nous avons les options suivantes :

  • Le script accepte des fichiers image en entrée, accompagnés d'un fichier texte (éventuellement facultatif) fournissant des informations supplémentaires.
  • Le script accepte un unique fichier texte en entrée, qui répertorie les images à traiter ainsi que toute information supplémentaire nécessaire.

Dans le premier cas, il convient de placer le fichier texte facultatif dans le même répertoire que les images, en lui attribuant un nom standard. Le script peut alors dériver le nom du répertoire parent depuis les images d'entrée et ouvrir le fichier texte du même répertoire s'il est présent. Un exemple de cette approche est la « bande de film » mentionnée plus haut : au début du script, nous définirons probablement un certain ordre standard des images, selon le nombre d'images transmises au script. Mais il pourrait y avoir des scénarios dans lesquels nous voulons nous écarter de l'ordre standard des images. Nous pourrions donc placer un fichier texte nommé ordering.txt dans le répertoire des images, lequel, s'il est présent, contrôlera l'ordre des images :

  strTxtFile="ordering.txt"
  PDir = fs.getParentFolderName(FName(0)) & "\"
  Wsh.CurrentDirectory = PDir

  If fs.FileExists(strTxtFile) then
    Set objFile = fs.OpenTextFile(strTxtFile, 1)
    bCtrlFile = True
    NCols = objFile.ReadLine
    objFile.close
  else
    bCtrlFile = False
  end if

[clip] Une application utile du second concept se trouve dans la projection en perspective d'une image sur un plan cible, telle que démontrée sur le site web de Fred Weinhaus. Nous pourrions utiliser ce concept pour « habiller » une image déformée en perspective sur une version (globalement) correcte en perspective, comme démontré à droite : dans la partie supérieure, l'image de gauche montre une photographie prise sur les lieux d'un accident mineur. La photographie de droite a été prise lors d'une visite ultérieure des lieux, depuis une position quelque peu surélevée. Dans la partie inférieure, la photographie de l'accident (c'est-à-dire la surface plane de la route) est projetée sur la photographie cible au moyen d'une transformation en perspective. (Le but est de visualiser l'angle d'orientation de la faible trace de dérapage laissée par le pneu avant droit de la voiture noire.) Pour accomplir cette tâche, l'utilisateur doit choisir quatre points dans l'image source et leurs points cibles dans l'image correcte en perspective. Nous pourrions le faire à la main, en déterminant les coordonnées dans l'image source et dans l'image cible par la sélection des points dans une visionneuse d'images (comme IrfanView), en notant leurs coordonnées et en les fournissant à une ligne de commande Convert. Ce travail fastidieux peut toutefois être simplifié par le logiciel gratuit WinMorph, qui offre une interface commode pour faire précisément cela : choisir des points sources et leurs points cibles correspondants sur deux images. Les lignes brisées jaunes des deux photographies relient les quatre points choisis dans chaque image. L'algorithme de morphing lui-même n'est toutefois pas adapté à effectuer une correction en perspective. (Le fonctionnement de base de cet algorithme est expliqué dans la partie Distorts de la section Usage du site web d'IM. Une démonstration de son utilité pour le morphing se trouve dans le script ShapeMorph de Fred Weinhaus.) WinMorph stocke ses informations dans un fichier texte structuré qui contient (parmi d'autres informations) les noms de fichiers de la source et de la cible, ainsi que les coordonnées des points sources et cibles. Nous pouvons donc dériver toutes les informations nécessaires à la distorsion en perspective d'IM depuis le fichier WinMorph. Vous pouvez télécharger une copie de tous les fichiers et images concernés dans le fichier wmpr.zip.

Redirection par pipe

Jusqu'ici, nous avons invoqué les outils en ligne de commande d'IM (comme Convert, Identify, Montage) directement via les fonctions Run ou Exec de l'objet Shell. Si toutefois nous voulons utiliser les capacités de pipe d'IM, c'est-à-dire alimenter une commande avec la sortie de la précédente, nous devons appeler les outils en ligne de commande via un environnement de commande. Par exemple, si nous voulons rogner les bords blancs de la planche-contact générée par le script ci-dessus, le code devrait être :

  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  strInputFiles  = ""
  For EACH Arg IN WScript.Arguments
      strInputFiles = strInputFiles & " """ & Arg & """"
  next
 '
  IndexFile= Left(WScript.Arguments(1),InStrRev(WScript.Arguments(1),"\")) & "index.jpg"
  Command = "cmd /c montage -geometry 210x140+0+5 -tile 6x " & strInputfiles & " miff:- | magick - -trim """ & IndexFile & """"
  wsh.run command, 7, true

Ici, nous appelons le processeur de commandes cmd avec l'option /c afin de fermer automatiquement la boîte de commande une fois terminé. À des fins de débogage, nous pourrions aussi l'invoquer avec l'option /k, qui laisse la boîte de commande ouverte et nous permet de lire d'éventuels messages d'erreur.

Tester et déboguer les VBScripts

Fondamentalement, nous utilisons VBScript pour construire la liste d'arguments des outils en ligne de commande d'IM, qui sont ensuite exécutés soit d'eux-mêmes, soit au sein d'une boîte DOS. Cela signifie qu'avant tout, vous devriez vous assurer que

  • la ligne de commande elle-même fait ce que nous attendons d'elle
  • la ligne de commande est construite correctement par le script.

Donc pour commencer, vous devriez tester la ligne de commande elle-même au sein d'une boîte DOS. Lors du premier test du script, vous ne devriez pas exécuter la commande IM, mais plutôt afficher la chaîne de texte dans une boîte de message via MsgBox(strCommand), car si la ligne de commande elle-même est erronée, il n'y a pas grand-chose qu'un outil de débogage puisse faire. La simple boîte de message est aussi utile pour déboguer le script, et je n'ai jamais vraiment ressenti le besoin d'un débogueur sophistiqué. Concernant le test à l'exécution, vous devriez vous assurer que

  • les outils en ligne de commande d'IM sont accessibles correctement
  • l'utilisateur a sélectionné ce que vous attendiez qu'il ou elle sélectionne, c'est-à-dire plusieurs fichiers (éventuellement d'un certain type), un répertoire, un fichier texte, etc.

Les messages d'erreur peuvent aisément être affichés à l'aide de MsgBox(...).


Informations complémentaires

Malheureusement, il n'existe aucun tutoriel connu (hormis celui-ci) couvrant spécifiquement l'usage des commandes ImageMagick dans les fichiers batch DOS. La page du site web DOS "For" Command Help offre une meilleure explication de l'usage de la commande « FOR ». Vous aimerez peut-être aussi consulter la page Batch Script de Bonzo.