Archive for February, 2011

About the image stack

1.Initial stack

When several images are loaded in G’mic, they are ordered in a stack. It is then possible to refer to them by using either positive (starting from the first image as [0]) or negative numbers (starting from the last image as [-1]).

For example, if 3 images A, B and C are loaded:

gmic A.png B.png C.png

It creates a stack that you can picture like that:

You can refer to A as image [0] or image [-3], B as [1] or [-2] and C as [2] or [-1]. So both commands below do exactly the same thing, they display B:

gmic A.png B.png C.png -display[1]
gmic A.png B.png C.png -display[-2]

2.Command with one dash

If, in your command line, you add an instruction using a single dash, it replaces the images to which the instruction applies by the result. Thus, to split the different channels of B, the 2 commands below could be used is added to our first command:

gmic A.png B.png C.png -split[1] c
gmic A.png B.png C.png -split[-2] c

And they would modified the stack as shown below:

As you can see, the image A is still [0], but not [-3] anymore, it has become [-5].

3.Command with two dashes

To keep the original image, instruction are called using 2 dashes. The original image is indeed kept in place and the result is added at the end of the stack.
So commands below:

gmic A.png B.png C.png --split[1] c
gmic A.png B.png C.png --split[-2] c

would modify the stack as below:

4.Stack order matters, not invoking order

When you apply a command to several images, sometimes, order matters. But be careful, stack order matters, not invoking order.
For example, both commands below have the same result:

gmic A.png B.png -append[0,1] y
gmic A.png B.png -append[1,0] y

If you want to apply your command in another order, you have to play with the image stack, such as:

gmic A.png B.png -reverse[0,1] -append[0,1] y

or

gmic A.png B.png -move[1] 0 -append[1,0] y
Advertisements

Comment créer un filtre dans le greffon G’mic ?

0-Introduction

Ce tutoriel a pour but de montrer comment créer un filtre personnalisé pour le greffon G’mic pour Gimp. Il part du principe que le lecteur ne connaît pas du tout le langage en ligne de commande G’mic.

Vous pouvez trouver des informations sur la façon de faire un filtre au début du fichier de commandes personnalisées par défaut et directement dans le greffon dans A propos > Création de filtres et aussi ci-dessous.

Ici, vous serez d’abord invité à créer un filtre très simple afin de comprendre les bases puis il s’agira d’assembler différents filtres afin d’en créer un meilleur.

1-Mon premier filtre

1.1-Le fichier des filtres personnalisés

Tous les filtres personnalisés que vous faites doivent être écrits dans un unique fichier texte appelé “.gmic“, n’oubliez pas le point au début du nom et n’ajouter rien d’autre, le nom de votre fichier texte n’est constitué que d’un point et de 4 lettres:: “.gmic“. Vous devez créer ce fichier dans votre répertoire “home” si vous êtes sous Linux, dans votre répertoire Application Data si vous êtes sous Windows et dans votre User Home folder si vous êtes sous MacOS. Ces 2 derniers systèmes d’exploitations peuvent rendre difficile la création de fichier commençant par un point: notepad or TextEdit peuvent vous aider au besoin.

1.2-Le filtre apparaît

Pour apparaître dans le greffon, vous devez inclure une ligne qui commence par #@gimp donnant le nom de votre filtre, la commande associée à ce filtre et optionnellement, la commande pour créer l’aperçu. Quelque chose comme:

#@gimp Mon premier filtre: mon_premier_filtre_commande, mon_premier_filtre_commande_preview

Vous pouvez essayer, mettez cette ligne dans votre fichier .gmic, rafraichissez les filtres G’mic et il devrait apparaître en haut de vos Filtres disponibles.

1.3-Le filtre dit quelque chose

Dans la partie droite de la fenêtre du greffon, vous pouvez mettre du texte et proposer différentes sortes de variables utilisables par le filtre. Pour cela, vous devez encore ajouter des lignes commençant par #@gimp. Vous pouvez par exemple recopier les lignes ci-dessous dans votre fichier .gmic et rafraîchir les filtres.

#@gimp Mon premier filtre: mon_premier_filtre_commande, mon_premier_filtre_commande
#@gimp : note = note("C'est mon premier filtre, je suis tellement excité!")
#@gimp : sep = separator()
#@gimp : Angle = float(45,0,360)
#@gimp : Remplir l'espace vide = choice("en noir","comme les bords","en répétant l'image")

1.4-Le filtre fait quelque chose

Jusqu’ici, votre filtre ne marche pas, si vous cliquer sur Valider, une erreur apparaîtra. C’est parce qu’aucune commande ne s’appelle “mon_premier_filtre_commande“, elle doit être créée en utilisant le langage G’mic. Donc, notre premier filtre peut être fini avec 2 lignes supplémentaires pour devenir:

#@gimp Mon premier filtre: mon_premier_filtre_commande, mon_premier_filtre_commande
#@gimp : note = note("C'est mon premier filtre, je suis tellement excité!")
#@gimp : sep = separator()
#@gimp : Angle = float(45,0,360)
#@gimp : Remplir l'espace vide = choice("en noir","comme les bords","en répétant l'image")
mon_premier_filtre_commande :
  -rotate $1,$2

si vous mettez ceci dans votre fichier .gmic et rafraichissez les filtres une fois de plus, vous avez un filtre pleinement fonctionnel capable de tourner une image. Vous pouvez ajuster l’angle de rotation de 0 à 360° et la valeur proposée par défaut est 45. Vous avez 3 choix pour “remplir l’espace vide”.
La commande utilisée par votre filtre est “mon_premier_filtre_commande” et c’est une commande très simple qui utilise l’instruction -rotate et les 2 variables $1 et $2 font référence à celles proposées au-dessus: “Angle” et “Remplir l’espace vide”.

1.5-Le filtre fait ce que vous voulez

Maintenant, vous avez les bases, vous avez juste besoin de vous inspirer des filtres déjà disponibles et de leur code source et si vous ne le connaissez pas encore, apprenez le langage de programmation G’mic. Pour ceux encore réticents à son apprentissage, il est possible d’assembler des filtres déjà existant en connaissant juste quelques trucs en plus.

2-Assembler des filtres

Après avoir utilisé le greffon, vous trouvez peut-être que ce serait bien si certains de vos filtres favoris pouvaient être assemblés afin de minimiser le nombre de clics. C’est d’une certaine façon possible.

2.1-Mimer un travail séquentiel

Si votre travail est purement séquentiel, c.à.d. si vous appliquez votre premier filtre sur une image, puis vous appliquez votre second filtre sur le résultat obtenu, etc. il est alors relativement facile de créer un filtre qui effectue les deux en un seul clic. Pour ça, vous devez récupérer les lignes de commandes exécutées par le greffon et les utiliser pour recréer un filtre comme expliqué au premier chapitre.
Par exemple, imaginons que vous vouliez assembler B&W pencil suivi de Soft glow (tous deux dans le répertoire Artistic folder). Pour récupérer la ligne de commande, la façon la plus facile est d’exécuter Gimp depuis un terminal et de régler les messages de sortie du greffon sur verbeux. Pour les 2 filtres en questions, vous obtiendriez dans votre console (ou votre fichier log) des lignes intéressantes comme:

[gmic_gimp]./apply/ -v -99 -gimp_pencilbw 0.3,60,0,0,0
[gmic_gimp]./apply/ -v -99 -gimp_glow 1,0,0

Votre nouveau filtre peut alors être écrit:

#@gimp BWpencil et Glow: bwpencil_glow, bwpencil_glow
bwpencil_glow :
  -gimp_pencilbw 0.3,60,0,0,0
  -gimp_glow 1,0,0

Et cela marche de la même façon avec 3, 4 et plus de filtres.

2.2-Proposer des réglages

Mais vous aurez remarqué (si vous l’avez essayé), il n’y a pas de réglages proposés dans l’assemblage de filtres. Pour en ajouter, vous devez faire comme expliqué ci-dessus. Ainsi, si vous voulez pouvoir régler la taille et l’amplitude pour B&W pencil et l’amplitude pour Soft glow, vous adapterez de cette façon:

#@gimp BWpencil and Glow: bwpencil_glow, bwpencil_glow
#@gimp : taillle = float(0.3,0,5)
#@gimp : Amplitude pour B&W pencil= float(60,0,200)
#@gimp : Amplitude pour Soft glow = float(1,0,20)
bwpencil_glow :
  -gimp_pencilbw $1,$2,0,0,0
  -gimp_glow $3,0,0

2.3-Assemblage complexe

Les choses deviennent plus compliquées quand vous gérer plusieurs images pendant la séquence de filtres que vous voulez assembler. Cela arrive, par exemple, si vous conservez l’original en réglant le Mode de sortie sur Nouveau(x) calque(s) (ou Nouveau(x) quoique ce soit) ou si un de vos filtres initiaux créent plusieurs images (comme Layers > Tiles to layers ou Layers > Split tones). Vous pouvez maitrisez cela en apprenant 2 autres petits trucs faciles du langage G’mic.

2.3.1-Conserver l’original

Jusqu’à maintenant, pour appeler une commande G’mic, vous mettiez un tiret (-) suivi du nom de la commande, par exemple:

  -gimp_pencilbw 0.3,60,0,0,0

Et bien, si vous mettez 2 tirets à la place, G’mic procède de la même façon avec les images, mais il conservera aussi l’original. Si vous essayez le filtre ci-dessous, même si vous réglez le Mode de sortie sur Sur place, vous obtenez votre résultats dans un nouveau calque:

#@gimp Keep BWpencil : keep_bwpencil, keep_bwpencil
keep_bwpencil :
  --gimp_pencilbw 0.3,60,0,0,0
2.3.2-Gérer plusieurs images

Pour gérer plusieurs images, G’mic leur donne des numéros commençant par 0. Donc, dans l’exemple précédent, votre image originale serait la numéro 0 et celle créée par le B&W pencil serait la numéro 1.
Si vous ne spécifiez rien, par défaut, la commande suivante est appliquée à toutes les images. Par exemple, dans le filtre qui suit, Soft glow est appliqué sur l’originale et sur celle provenant de B&W pencil.

#@gimp Keep BWpencil plus glow : keep_bwpencil_glow, keep_bwpencil_glow
keep_bwpencil_glow :
  --gimp_pencilbw 0.3,60,0,0,0
  -gimp_glow 1,0,0

Mais, si vous accolez le numéro de l’image entre crochets à votre nom de commande, alors le filtre ne sera appliqué qu’à l’image spécifiée. Ainsi, si vous modifiez le filtre précédent comme ci-dessous, le Soft glow n’est exécuté que sur l’image résultant de B&W pencil, laissant l’originale intacte:

#@gimp Keep BWpencil plus glow : keep_bwpencil_glow, keep_bwpencil_glow
keep_bwpencil_glow :
  --gimp_pencilbw 0.3,60,0,0,0
  -gimp_glow[1] 1,0,0

Vous pouvez spécifiquement demander à un filtre de s’exécuter sur plusieurs images en ajoutant d’autres nombres séparés par une virgule. Pour filtrer la première, la troisième et la cinquième, vous accoleriez [0,2,4] au nom de votre commande. Il y en plus à savoir à ce sujet.

2.3.2-Finissions ce machin

Au point où on en est, ce filtre me semble non-fini. J’ai l’impression qu’il pourrait être utile à quelqu’un si les 2 calques obtenus étaient recomposés ensemble avec une sorte de Layers Multiply et si quelques possibilités de réglage étaient offertes à l’utilisateur. Et puisque 2 filtres ont été construits pendant ce tutoriel, mettons-les tous les deux dans le fichier .gmic afin qu’ils puissent tous deux être utilisés dans le greffon. En totalité, cela ressemblera à quelque chose comme:

#@gimp Mon premier filtre: mon_premier_filtre_commande, mon_premier_filtre_commande
#@gimp : note = note("C'est mon premier filtre, je suis tellement excité!")
#@gimp : sep = separator()
#@gimp : Angle = float(45,0,360)
#@gimp : Remplir l'espace vide = choice("en noir","comme les bords","en répétant l'image")
mon_premier_filtre_commande :
  -rotate $1,$2

#@gimp Filtre du tutoriel  : filtre_tuto, filtre_tuto
#@gimp : Size = float(0.3,0,5)
#@gimp : Amplitude pour B&W pencil= float(60,0,200)
#@gimp : Amplitude pour Soft glow = float(1,0,20)
filtre_tuto :
  --gimp_pencilbw $1,$2,0,0,0
  -gimp_glow[1] $3,0,0
  -compose_multiply

2.4-Pour aller plus loin

Puisque qu’il s’agit de programmation, il est probable que vous rencontriez quelques bugs. Pour debugger, penser à régler les Messages de sortie sur Mode verbeux ou Très verbeux. Et ne restez pas bloqués seuls venez trouver inspiration et aide et partager ce que vous avez fait.
Une fois que vous aurez un peu jouer, vous voudrez peut-être apprendre quelques trucs en plus.

Custom command for the command line

0-Introduction

It is possible and easy to make your own custom command in G’mic. It is written in a file that has to be called when needed.

1-The G’mic command file

The custom commands you define have to be written in a text file. Its name is supposed to finish by the .gmic extension, but it isn’t compulsory. It is called using the command -command or its shortcut -m or by no command at all if its extension is indeed .gmic.

So, let’s say you want to use your own command called my_custom_command that you wrote in a file called macros.gmic on a picture called image.jpg. Then the 3 following commands are valid and equivalent:

gmic image.jpg -command macros.gmic -my_custom_command
gmic image.jpg -m macros.gmic -my_custom_command
gmic image.jpg macros.gmic -my_custom_command

If you have already made some custom filters for the plugin, you can use them by calling the file named .gmic in your home directory. In linux, this is done for example this way:

gmic image.jpg ~/.gmic -my_custom_command

2-Building that my_custom_command

2.1-Define it

To define a custom command, just write the command name followed by a space and a colon in your G’mic file. So if you write the line below :

my_custom_command :

it is defined. And if you use it:

gmic image.jpg macros.gmic -my_custom_command

It won’t return any error, even if it doesn’t do anything so far.

2.2-Give it orders

To have your custom command do something, just write what it should do below in a usual G’mic language, ex:

my_custom_command :
  -rotate 45
  -resize 50%,50%

2.3-Arguments

2.3.1-Just arguments

Arguments can be used in your custom command, for example, it can become:

my_custom_command :
  -rotate $1
  -resize $2,$2

But from now on, you should not forget to specify arguments when you call it:

gmic image.jpg macros.gmic -my_custom_command 45,50%
2.3.1-Setting default arguments

So far, if you forget to specify one argument, you get an error message. It might be better to propose some default setting. It is usually done using the -skip command like this:

my_custom_command : -skip ${1=45},${2=50%}
  -rotate $1
  -resize $2,$2

Now, you don’t have to specify any argument, you can, but if you don’t, the default ones are applied. The 3 lines below now thus produce the same output:

gmic image.jpg macros.gmic -my_custom_command
gmic image.jpg macros.gmic -my_custom_command 45
gmic image.jpg macros.gmic -my_custom_command 45,50%
2.3.2-Checking arguments validity

To avoid weird behavior and for cleanliness, it is sometime better to check the validity of an argument. For instance, it is wise to avoid a negative argument for the -resize function. This is done with -check:

my_custom_command : -skip ${1=45} -check ${2=50%}>0
  -rotate $1
  -resize $2,$2

Like this, in case of negative second argument:

gmic image.jpg macros.gmic -my_custom_command 45,-400

you get an explicit error message:

[gmic]-1./my_custom_command/ *** Error in ./my_custom_command/ *** Command 'check' : expression '-400>0' is false.

3-Polishing it

So far, the custom command does its job as it should, but it is still possible to improve it.

3.1-Comments in the code

You can add comments in the code with the hash (#) :

my_custom_command : -skip ${1=45} -check ${2=50%}>0
 -rotate $1  # to make it rotate
# and then it will be resized!
  -resize $2,$2

3.2-Comments in the terminal

So far, if you look at your terminal, you get to know every steps of your custom command:

[gmic]-1./my_custom_command/ Rotate image [0] of 45 degree, dirichlet borders and linear interpolation.
[gmic]-1./my_custom_command/ Resize image [0] to 50%x50%x100%x100% , with nearest neighbor interpolation, dirichlet borders and centering (0,0,0,0).

But you might feel it lighter if you only get one line considering your custom command as a whole. This is done by reducing the verbosity during the execution of you command, using -v - at the start and -v + at the end.
Then add your own comment before everything with -echo[^-1] (or its shortcut -e[^-1]). For example:

my_custom_command : -skip ${1=45} -check ${2=50%}>0
  -e[^1] "My rotate-resize of $1 and $2 on image$?"
  -v -
  -rotate $1
  -resize $2,$2
  -v +

lets in the terminal:

[gmic]-1./ My rotate-resize of 45 and 50% on image [0]

3.3-Help message

To make everything slicker, it is also possible to add some help message meant to be displayed in case of error. For that, start the command description with:

#@gmic my_custom_command

and then add informations with lines starting this way:

#@gmic :

At the end, the code might look:


#@gmic my_custom_command : _angle, pixel size
#@gmic : This crappy custom command
#@gmic : just rotate and resize
my_custom_command : -check "${2=50%}>0"
  -e[^1] "My rotate-resize of $1 and $2 on image$?"
  -v -
  -rotate $1
  -resize $2,$2
  -v +

Now if you type something wrong:

gmic image.jpg macros.gmic -my_custom_command 45,-400

You get some help:

[gmic] Command 'my_custom_command' has the following description : 

    -my_custom_command _angle, pixel size       

        This crappy custom command
        just rotate and resize

4.And then

You can put as many custom command as you want in one G’mic file. You can now easily make loops (-repeat … -done), if statement (-if … -elif … -else … -endif), use variables (foo=”bar” … -e $foo) and so on.