Déplacer un calque vers une position X, Y spécifique dans Gimp

58

Comment déplacer un calque vers une position XY spécifique dans le canevas dans Gimp?

Actuellement, le seul moyen que je puisse trouver est de simplement regarder les yeux avec les guides et / ou la position de la souris. Je veux spécifier les coordonnées X et Y exactes.

Scott
la source
Je veux savoir cela aussi, ou comment le faire dans Photoshop. J'ai fait une question pour cela. superuser.com/questions/345669/…
Jonny
1
Ne semble pas être (facilement) possible dans GIMP sans utiliser le code Python décrit ci-dessous: graphicdesign.stackexchange.com/a/6813/8841
SabreWolfy
Oui c'est possible. Lire ma réponse.
David

Réponses:

31

Je crains que Gimp ne l'inclue pas parce que c'est fastidieux. Ce n'est tout simplement pas la manière appropriée d'aligner les éléments lors de la conception, même si je reconnais que c'est parfois utile comme raccourci. Quoi qu'il en soit, la meilleure approche (correcte) consiste à utiliser des guides:


A) Étape 1 - Créer les guides

  1. Aller à Image-> Guide-> Nouveau Guide
  2. Spécifiez si vous voulez et un guide horizontal ou vertical
  3. Spécifiez le nombre de pixels
  4. Répétez la procédure pour un autre guide horizontal ou vertical (vous pouvez également créer plusieurs guides pour spécifier la largeur et la hauteur).

Alternativement, vous pouvez également créer les repères glissant des règles:

  1. Faites glisser vers le bas (à partir de la règle supérieure) un guide sur la coordonnée Y souhaitée.
  2. Faites glisser vers le bas (à partir de la règle de gauche) un guide sur la coordonnée X souhaitée.

B) Étape 2 - Déplacer la toile

Vous pouvez utiliser l'outil de déplacement.

  1. Sélectionnez votre couche
  2. Allez dans Outils -> Outils de transformation -> Déplacer
  3. Faites glisser le calque vers les guides. Gimp vous donnera un coup de main avec les pixels exacts.

L'un des principes de conception est que vous devez aligner les éléments sur l'ensemble de votre projet. Réduire le nombre d'alignements (guides) vous aide à obtenir un design plus propre. Je pense que c’est la raison pour laquelle gimp n’inclut pas d’outil permettant de spécifier les coordonnées exactes. Si vous souhaitez suivre ce principe de conception, spécifier les coordonnées exactes une par une devient un travail fastidieux.

toto_tico
la source
Exactement ce dont j'ai besoin - merci. Cas d'utilisation: créer un fond d'écran pour une configuration à deux têtes à partir de deux autres fonds d'écran. :)
samedi
22
  1. Choisissez entrez la description de l'image ici(outil d'alignement).
  2. Fais le Relative to Image.
  3. Cliquez sur votre calque (dans la toile).
  4. Entrez X dans le Offsetchamp.
  5. Cliquez sur Distribute/ entrez la description de l'image ici(flèche gauche).
  6. Entrez Y dans le Offsetchamp.
  7. Cliquez sur Distribute/ entrez la description de l'image ici(flèche haut).

C'est ça!

David
la source
1
Ce travail pour offset négatif.
Loda
1
Notez qu'il semble que vous ne pouvez sélectionner que le calque visible en haut, c'est-à-dire qu'il faut masquer les calques en haut du calque pour les aligner (gimp 2.8.16).
Skippy le Grand Gourou
Est-ce que cela utilise l'unité de pixels? Cela semble bouger mon image beaucoup plus que ce à quoi je m'attendais.
palswim
@palswim Pour moi, cela a fonctionné lorsque j'ai cliqué sur le groupe de boutons supérieur (Aligner) au lieu du groupe du bas (Distribuer). Oui, cela se mesure en pixels (au moins dans ma configuration).
Rodrigo
20

Pour ce faire, il existe un script qui peut être téléchargé à partir du registre du plugin GIMP. On l'appelle:

Déplacer le calque vers (télécharger) .

À installer:

  1. Déplacez le script dans un %USERPROFILE\.gimp-2.8\scriptsrépertoire sous Windows, ~/Library/Application Support/GIMP/2.8/scriptsOS X ou ~/.gimp-2.8/scriptsLinux. ( Instructions officielles )

  2. Clics Filters-> Script-Fu-> Refresh scripts.

  3. Le nouvel élément de menu apparaîtra au bas du Layermenu Move to.

garyb
la source
Belle première réponse!
slm
Presque parfait! Ce serait bien si la boîte de dialogue de paramètre utilisait les coordonnées actuelles de la couche comme valeurs par défaut.
Oliver Giesen
4
Vous devez télécharger ce fichier .scm et le mettre dans %USERPROFILE%\.gimp-2.8\scriptsWindows, puis faire Filters-> Script-Fu-> Refresh Scriptset il sera disponible comme élément le plus en bas Layer->Move To
DarkWalker le
3
Davids answer fait le travail sans script.
Michael S.
1
Ne fonctionne pas pour le décalage négatif. et l'UX est médiocre (ne conservez pas la dernière valeur, etc.).
Loda
11

J'utilise GIMP 2.6.11.

Avec ces lignes de Python, le calque actif peut être déplacé vers une position absolue, comme (32, 64), à partir de la console Python:

>>> x_new = 32
>>> y_new = 64
>>> img = _[0]
>>> layer = img.active_layer
>>> x_off, y_off = layer.offsets
>>> pdb.gimp_layer_translate(layer, x_new - x_off, y_new - y_off)

Si vous souhaitez uniquement déplacer le contenu du calque, vous pouvez également:

clic droit, Calque> Transformer> Décaler

ou Shft + Ctrl + O

Nicolas Kaiser
la source
1
Cela provoque les pixels dans la couche de se déplacer, plutôt que la couche elle - même - je dois déplacer la couche réelle. Ce que vous avez suggéré peut fonctionner si le calque a la même taille que le canevas, ou au moins suffisamment grand pour ne pas couper de pixels non transparents dans le calque.
Scott
@ Scott: Je vois - désolé, je n'ai pas trouvé de moyen plus simple, mais au moins j'ai compris comment déplacer le calque vers une position absolue avec certaines lignes de Python.
Nicolas Kaiser
2
La ligne trois de votre code devrait être img=gimp.image_list()[0]. Le _ n'a pas fonctionné pour moi.
apple16
3

Il existe un moyen très pratique de le faire disponible depuis Gimp v.2.10:

  1. double-cliquez sur le calque que vous souhaitez déplacer (ou cliquez dessus avec le bouton droit de la souris et sélectionnez "Modifier les attributs du calque")

  2. la boîte de dialogue "Edit Layer Attributes" (Modifier les attributs de la couche) apparaît et vous pouvez modifier les décalages X / Y en fonction de vos besoins.

Simplement facile comme ça! :)

Modifier les attributs de décalage des couches X / Y

MODIFIER:

Comme @Michael l'a demandé dans son commentaire à ma réponse, j'ajoute un script qui déplacera TOUS les calques d'image par des décalages x, y spécifiés.

Pour que cela fonctionne, vous devez créer un fichier dans le dossier de script Gimp (une référence pour cela si vous en avez besoin: iciou ici) avec le contenu suivant:

; This script 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; either version 2 of the License, or
; (at your option) any later version.
;
; This script 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.

;; Command is installed in "Layer->Move all layers..."
;;
;; The purpose of this script is to move all image layers by specified x,y offsets
;; X and Y offset parameters must be provided (use integer numbers as values)
;;


(define (dn-move-all-layers orig-image drawable
                                       x-offset y-offset)
  (define (get-all-layers img)
    (let* (
      (all-layers (gimp-image-get-layers img))
      (i (car all-layers))
      (bottom-to-top ())
     )
     (set! all-layers (cadr all-layers))
     (while (> i 0)
       (set! bottom-to-top (append bottom-to-top (cons (aref all-layers (- i 1)) '())))
       (set! i (- i 1))
     )
     bottom-to-top
    )
  )
  (define (move-layer orig-image layer-id offset-x offset-y)
    (gimp-layer-set-offsets
      layer-id
      offset-x
      offset-y
    )
  )
  (let* (
      (layers nil)
      (layerpos 1)
      (layer-id "")
      (x-os 0)
      (y-os 0)
      (orig-selection 0)
   )
   (gimp-image-undo-disable orig-image)
   (set! orig-selection (car (gimp-selection-save orig-image)))
   (gimp-selection-none orig-image)

   (set! x-os x-offset)
   (set! y-os y-offset)
   (set! layers (get-all-layers orig-image))
   (while (pair? layers)
     (move-layer orig-image (car layers) x-os y-os)
     (set! layers (cdr layers))
     (set! layerpos (+ layerpos 1))
   )
   (gimp-displays-flush)
   (gimp-selection-load orig-selection)
   (gimp-image-remove-channel orig-image orig-selection)
   (gimp-image-undo-enable orig-image)
  )
)

(script-fu-register "dn-move-all-layers"
 "Move all layers..."
 "Move each layer by specified x,y offsets."
 "danicotra"
 "danicotra"
 "08/08/2019"
 ""
 SF-IMAGE "Input image" 0
 SF-DRAWABLE "Drawable" 0
 SF-VALUE "X offset" "0"
 SF-VALUE "Y offset" "0"
)

(script-fu-menu-register "dn-move-all-layers"
                         "<Image>/Layer/")

Si vous le faites bien, vous trouverez une nouvelle commande dans le menu "Calque" intitulée "Déplacer tous les calques ...", lancez-la et une boîte de dialogue s'affichera vous permettant de décider des décalages X et Y. C'est ça.

Danicotra
la source
Y a-t-il moyen de rendre cela un peu plus rapide lorsque vous avez beaucoup de couches à déplacer (comme par centaines)? Ce serait génial si ce truc pouvait s'amarrer, alors je n'avais pas à l'amener à chaque couche!
Michael
1
@ Michael: Eh bien, je suppose que dans ce cas, vous devriez utiliser des scripts, à l'instar de la solution suggérée par Nicolas Kaiser, mais en boucle sur les calques d'image ... Je viens de modifier ma réponse pour vous montrer comment, regardez. (J'aurais fait une réponse séparée pour cela, mais le PO a demandé spécifiquement de déplacer UNE couche, pas toutes. Si vous posez une nouvelle question à ce sujet, je serais ravi de répondre à cette question en ajoutant des captures d'écran et tout le reste; - D) À la vôtre
danicotra