HervéRenault.fr

Un plugin Gimp pour recoller des morceaux d'image

J'ai eu à faire des captures d'écran d'une appli qui ne permet pas d'afficher son contenu en entier ou d'en faire une capture globale comme le permettent les navigateurs web (je pense à Firefox). J'ai fait ces captures avec une petite zone de recouvrement pour pouvoir plus facilement recoller les morceaux par superposition de calques. Comme j'aime utiliser Gimp et Python, j'ai fait ce petit plugin en vitesse pour accélerer la tâche. Je le partage au cas où il pourrait être utile. Il faut l'installer dans ~/.config/GIMP/2.10/plug-ins/ ou autre répertoire configuré dans Préférences > Dossiers > Greffons. Il faut aussi avoir installé le paquet gimp-python.

2021 OBSOLÈTE ! Gimp 2.10 ne supporte plus Python 2, ni en paquet officiel Ubuntu (apt), ni en Snap. Et Gimp 3 n'est pas encore prêt (il devrait avoir Python 3) donc j'ai abandonné cette méthode. Je conserve cette page pour mémoire. Les scripts en Scheme pour mettre l'opacité du calque à 50 % ou 100 % sont toujours valables.

Mode d'emploi

exemple de recouvrement de calques semi-transparent

Le script à mettre dans le répertoire de plug-ins

# -*- encoding: UTF-8 -*-

# utile pour recoller des morceaux de copie d'écran
# colle l'image courante supposée être la deuxième
# comme calque semi-transparent sur la première image (la première copie d'écran)

# j'installe un raccourci dans Gimp vers ce script : Shift-Ctrl-L (comme Layer)
# à utiliser comme ceci :
#     1. éventuellement créer un point de positionnement dans l'image 1 avec l'outil Bézier (sinon 0,0)
#     1. Ctrl-Imp écr (c'est mon raccourci dans XFCE pour envoyer les copies d'écran à Gimp)
#     2. Shift-Ctrl-L
#     3. Ctrl-W pour fermer la copie d'écran (l'image 2)
#               parce que l'API interdit à un script de fermer une image qu'il n'a pas créée
#               (comme elle n'a pas été modifiée, elle se ferme sans rien demander, ouf !)

from gimpfu import *

def colle_calque_sur_chemin():
    img2 = gimp.image_list()[0]
    img = gimp.image_list()[1]

    gimp.context_push()
    img.undo_group_start()


    if img.vectors:
        # je ne prends que le dernier vector en date = la dernière courbe créée avec B
        # les vectors s'ajoutent en tête de liste donc c'est toujours le premier [0]
        # je ne prends que le dernier segment de la courbe (je ne vois pas pourquoi je ferais plusieurs segments mais bon...)
        # les segments s'ajoutent en fin de liste...
        # je ne prends que le dernier point (plus pratique si je crée un nouveau point en oubliant que j'en ai déjà d'autres)
        # les points sont dans une liste avec un booléen en deuxième position donc points[0]
        # je ne sais pas pourquoi les points sont triplés (quel rapport éventuel avec rgb ?)
        # mais du coup je prends les deux derniers chiffres, c'est l'accès le plus simple
        # print img.vectors
        # print img.vectors[0].strokes
        # print img.vectors[0].strokes[-1].points
        x, y = [ int(round(i)) for i in img.vectors[0].strokes[-1].points[0][-2:] ]
    else:
        x, y = [0, 0]

    pdb.gimp_message("Colle comme calque en " + str(x) + ", " + str(y))

    #                               width, height, type, name,      opacity, mode
    layer = pdb.gimp_layer_new(img, img2.width,  img2.height,   1,    "morceau", 50,      0)
    img.add_layer(layer)
    pdb.gimp_layer_translate(layer, x, y)
    pdb.gimp_selection_none(img)

    pdb.gimp_edit_copy_visible(img2)

    #                                         clear current image selection (?)
    floating_sel = pdb.gimp_edit_paste(layer, True)
    pdb.gimp_floating_sel_anchor(floating_sel)

    img.undo_group_end()
    gimp.context_pop()


register(
    "python_fu_colle_calque_sur_chemin",
    "Colle calque sur chemin",
    "Colle calque sur chemin",
    "HR",
    "HR",
    "2017",
    "Colle calque sur chemin",
    "",
    [],
    [],
    colle_calque_sur_chemin,
    menu="<Image>/Python-fu/")

main()

Qu'apporte ce plugin ?

Certes, il ne colle pas les morceaux d'image automatiquement comme AutoStitch ou Hugin. Mais, avec les deux petits scripts en Scheme (layer-opacity-*.scm) il permet de raccourcir le travail manuel en supprimant ces étapes :

Bref, s'il peut quand même vous être utile, je serais curieux de le savoir. Envoyez-moi un petit mail, juste pour le fun ;)