Gimp - Script-fu - Mettre des images au format 3:2


Problématique

Une visionneuse de photos placée dans une page web possède en général une taille et un format donnés. Il existe, par exemple, des visionneuses au format 3:2 avec diverses tailles en pixels (450x300, 600x400, 900x600, 1200x800... ). Le format paysage 3:2 et le format portrait 2:3 sont utilisés par les appareils photo numériques de type reflex. Les formats paysage 4:3 et portrait 3:4 sont généralement utilisés par les appareils photo numériques de type compact. Une photo est prise au format paysage lorsque l’appareil photo a été tenu horizontalement et au format portrait lorsque celui-ci a été tenu verticalement.

Quand un ensemble de photos est confié à un webmaster, en vue de leur affichage dans une visionneuse, toutes les photos constituant ce lot ne possèdent malheureusement pas toujours la même taille ni le même format. Le lot fourni peut inclure, par exemple, des photos au format paysage, d’autres au format portrait et parfois même des photos présentant des formats divers et variés et ceci avec des tailles diverses. Cela se produit quand les photos ont été découpés de façon intuitive, avec un logiciel graphique, sans avoir préalablement fixé la taille et le format souhaités.

Diverses solutions peuvent être envisagées face à ce problème mais aucune d’elles n’est entièrement satisfaisante. On peut notamment :

  • 1 - Demander à la personne qui a préparé le lot de photos de recommencer ce travail en fixant au moins le format des découpes à défaut de fixer leurs tailles ;
  • 2 - Redimensionner automatiquement les photos au format souhaité avec un logiciel graphique, en autorisant les déformations d’images ;
  • 3 - Redécouper les photos une par une pour les mettre au bon format sans déformation d’image.

La première solution nécessite un arbitrage, demande du temps et est susceptible de conduire à un refus. La seconde est facile à mettre en œuvre, à l'aide d'un traitement de redimensionnement par lot, mais elle conduit à un affichage désastreux car les photos sont plus ou moins déformées. La troisième nécessite un temps de travail considérable si le lot de photos à redécouper est important.

Le script présenté dans cette page a été imaginé et écrit pour apporter une solution simple à ce problème. Utilisé avec un outil de traitement par lot (comme par exemple le plugin «BIMP» pour GIMP, créé par alessandro francesconi), il remet automatiquement et rapidement toutes les photos d’un même répertoire au format 3:2 et ce quels que soient la taille et le format de chacune de ces photos dans ce répertoire. En effet, quels que soient le format et la taille de l'image ouverte dans GIMP, le script donne à celle-ci un format paysage 3:2 dans une taille qui conserve la hauteur ou la largeur de l’image de départ. Si la largeur de l'image de départ est inférieure à sa hauteur, le script la met au format 3:2 en la complètant avec du noir à gauche et à droite, sinon il la complète avec du noir placé au bon endroit ( au dessus et au dessous ou à droite et à gauche selon le cas).

Remarque : Après traitement par le script, les photos possèdent toutes le même format mais elles ne possèdent pas nécessairement toutes la même taille. Cependant, étant donné que les photos traitées possèdent toutes le même format, il devient alors facile de les redimensionner dans une même taille sans déformation à l’aide d’un traitement par lot de redimensionnement classique (en utilisant le plugin BIMP pour GIMP (cf lien ci-dessus) ou un logiciel de traitement par lot adapté comme FastStone Photo Resizer par exemple). Un lot important de photos peut ainsi être traité et mis en ligne très rapidement.

Les tailles et les formats pouvant être rencontrés pour des photos découpées sont en nombre infini mais seulement cinq cas de figure sont à considérer pour la mise d'une photo au format 3:2.

  • cas n°1 - Si la largeur w de la photo est à la fois supérieure à sa hauteur h et supérieure à 1,5 fois sa hauteur, il faut compléter la photo avec une couleur de fond au dessus et au dessous
  • cas n°2 - Si la largeur w de la photo est à la fois supérieure à sa hauteur h et égale à 1,5 fois sa hauteur, il n’y a rien à faire car la photo est déjà auformat 3:2
  • cas n°3 - Si la largeur w de la photo est à la fois supérieure à sa hauteur h et inférieure à 1,5 fois sa hauteur, il faut compléter la photo avec une couleur de fond à gauche et à droite
  • cas n°4 - Si la largeur w de la photo est inférieure à sa hauteur h, il faut compléter la photo avec une couleur de fond à gauche et à droite
  • cas n°5 - Si la largeur w de la photo est égale à sa hauteur h, il faut également compléter la photo avec une couleur de fond à gauche et à droite

001

Dans ces cinq cas le script suivant place la photo de départ dans un cadre paysage 3:2 le plus petit possible, en remplissant les parties non occupée par cette photo avec une couleur de fond. La couleur de fond à adopter, pour obtenir un rendu esthétique, dépend des couleurs de fond de la visionneuse et de la page web considérée.

Ecrire et enregistrer le script

Ecrire le script suivant avec le Bloc-Notes, le sauvegarder avec le nom «paysage-3-2.scm» (l’utilisation de ce nom est obligatoire car il doit correspondre à celui indiqué dans le script afin que GIMP puisse l’enregistrer correctement). Placer ce fichier dans le répertoire «C:/ Program Files/ GIMP/ lib/ gimp/ 2.0/ share/ gimp/ 2.0/ scripts».

La première partie du script consiste à déclarer les variables qui sont utilisées par le script. Le paramètre «inImage» passé à la fonction define est associé à la ligne «SF-IMAGE "Mon Image" 0» située en fin de script. Il correspond à l’image en cours ouverte dans la fenêtre principale de GIMP.

Les variables utilisées par le script sont :

  • w et h : pour recevoir les valeurs de largeur (width) et de hauteur (height) de l’image de départ ouverte dans GIMP ;
  • u et v : pour conserver une copie des valeurs de largeur (width) et de hauteur (height) de l’image de départ ouverte dans GIMP ;
  • i, j : pour faciliter les calculs intermédiaires lors des calculs de nw, nh, offx et offy ;
  • k : pour rendre plus lisibles les conditions placées entre les parenthèses dans les instructions conditionnelles if ( ) ;
  • nw et nh : pour ranger les valeurs de la nouvelle largeur (new width) et de la nouvelle hauteur (new height) de l’image après passage au format paysage 3/2 ;
  • offx et offy pour ranger les valeurs de décalage (offset), horizontal et vertical en abscisse et en ordonnée, de l’image ouverte, par rapport à l'abscisse et à l'ordonnée (0,0) de la zone vide, à l’intérieur du cadre au format 3:2 contenant l'image d'origine. (voir schéma ci-après).

03

;----------
; Ce script met au format paysage 3:2 une image quelconque ouverte
; dans GIMP, sans la déformer mais en utilisant une couleur de remplissage
; Auteur : Claude Turrier - 28 mai 2016
;--------------
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;---------------
(define (script-fu-paysage-3-2 inImage )
; --déclarer les variables utilisées par le script
(let* ( (nw 0) (nh 0) (offx 0) (offy) (u 0) (v 0) (i 0) ( j 0) (k 0) (h (car (gimp-image-height inImage))) (w (car (gimp-image-width inImage))) )
; --fixer la couleur de remplissage à noir
(gimp-context-set-background '(0 0 0))
; --placer la hauteur et la largeur de l'image ouverte dans u et v
(set! u w) (set! v h) (set! k (* (/ 3 2) v) )
; --quel que soit le format de l'image ouverte on le transforme en un format paysage 3/2
; --si la hauteur de l'image est inférieure à sa largeur, on la complète avec du noir en haut et en bas
; --sinon on la complète avec du noir à gauche et à droite
; --cas n°1 : w > h et w > 1,5 h
(if (> u v)
(if (> u k)
(begin
(set! i (/ 2 3) ) (set! nh (* w i))
(set! i (/ 1 3) ) (set! j (* w i)) (set! i (/ h 2)) (set! offy (- j i ))
(gimp-image-resize inImage w nh 0 offy)
);end begin
) ; end if
) ; end if
; --cas n°2 : w = 1,5 h. Il n'y a rien à faire car la photo est déjà au bon format
; --cas n°3 : w > h et w < 1,5 h
(if (> u v)
(if (< u k )
(begin
(set! i (/ 3 2) ) (set! nw (* h i))
(set! i (/ 3 4) ) (set! j (* h i)) (set! i (/ w 2)) (set! offx (- j i ))
(gimp-image-resize inImage nw h offx 0)
);end begin
) ; end if
) ; end if
; cas n° 4 : w < h
(if (< u v)
(begin
(set! i (/ 3 2) ) (set! nw (* h i))
(set! i (/ 3 4) ) (set! j (* h i)) (set! i (/ w 2)) (set! offx (- j i ))
(gimp-image-resize inImage nw h offx 0)
);end begin
) ;end if
; cas n° 5 : w = h
(if (= u v)
(begin
(set! i (/ 3 2) ) (set! nw (* h i))
(set! i (/ 3 4) ) (set! j (* h i)) (set! i (/ w 2)) (set! offx (- j i ))
(gimp-image-resize inImage nw h offx 0)
);end begin
) ;end if
; --aplatir l'image
(gimp-image-flatten inImage)
) ; fin de let*
) ; fin de define
;--Faire enregistrer le script par Gimp
(script-fu-register "script-fu-paysage-3-2"
"<Image>/MesScripts/paysage-3-2"
"-------------"
"Met les images au format 3/2"
"Claude Turrier"
"2016"
"-------------"
SF-IMAGE "Mon Image" 0
)

Télécharger le code source du script : paysage-3-2.scm
La variante suivante, du script précédent, permet d'obtenir une dimension finale d'image de 800x533 pixels : paysage-800-533.scm

Appliquer le script à une image

Ouvrir dans GIMP une image de taille et de format quelconques, 600x300 par exemple, en cliquant l’option de menu «Fichier/Ouvrir».

04

Cliquer l'option de menu «MesScripts/ paysage-3-2» pour appliquer le script à cette image.

05

Constater que le travail effectué par le script n’est pas visible dans la fenêtre de Gimp. Cela provient du fait que l’affichage de l’image en cours n’a pas été actualisé dans la fenêtre de GIMP. Pour que le travail effectué par le script puisse apparaître dans la fenêtre de GIMP, il suffit de cliquer sur l’œil situé à gauche de l’image dans la boîte des calques (rappel : pour faire apparaître la boîte des calques avec Gimp 2.8, il faut cliquer l’option de menu «Fenêtres/Fenêtres ancrables/Calques »).

06

Le calque devient transparent. Cliquer une deuxième fois le même emplacement pour faire réapparaître l'image dans le calque.

07

La fenêtre est alors actualisée et le travail effectué par le script devient visible dans la fenêtre de GIMP. L’image complétée avec la couleur de fond noir présente une taille de 600x400. Elle correspond à rectangle noir de format 3:2 à l’intérieur duquel est placée l’image initiale.

08

Il ne reste plus qu’à sauvegarder l’image modifiée, avec un nom différent de celui de l’image de départ afin de ne pas effacer cette dernière («Fichier/Export As...»).

Appliquer le script à un lot d’images

Pour appliquer le script automatiquement à un lot d’images, il suffit d’utiliser, par exemple, le plugin «BIMP» pour GIMP créé par alessandro francesconi (cf lien ci-dessus).
L’installation et l’utilisation de ce plugin sont décrits dans la page GIMP - Traitement par lot

Soit, par exemple, un lot de 5 fichiers images nommées «1.jpg» à «5.jpg» placés dans un répertoire «D:\source» et soit un répertoire «D:\destination» vide. Supposons que les photos «1.jpg», «2.jpg», «3.jpg», «4.jpg» et«5.jpg», soient respectivement aux formats 3:2, 1:1, 4:3, 16:9 et 2:3.

09

Ouvrir GIMP puis lancer «BIMP» en cliquant l’option de menu «Fichier/Batch Image Manipulation»

10

Dans la boîte de dialogue «BIMP» qui s'ouvre, cliquer sur les trois boutons suivants, effectuer les choix nécessaires puis cliquer le bouton «Appliquer» :

  • «Ajouter des images» - choisir l’option «Ajouter des dossiers» puis choisir le dossier «D:\source»
  • «destination» - choisir le dossier «D:\destination»
  • «Ajouter» - choisir l’option «Autres procédures Gimp...» puis choisir le script «script-fu-paysage-3-2»

11

Le script effectue le travail. Une fois celui-ci terminé, le nombre d’erreurs éventuelles est affiché dans la barre de progression verte. Dans le cas présent il n’y a pas d’erreurs. Tout s’est bien passé.

12

Explorer le répertoire «D:\destination» pour vérifier qu’il contient bien une copie de toutes les images ramenées au format 3:2 avec l'aspect attendu.

13

L’application d’un script-fu d’encadrement des photos, un script de type cadrenoirblanc2 générant un cadre noir blanc de 4 pixels de large par exemple, permet de finaliser le travail.

14