Przenieś warstwę do określonej pozycji X, Y w Gimp


57

Jak przenieść warstwę do określonej pozycji XY w obszarze roboczym w Gimp?

Obecnie jedyny sposób, jaki mogę znaleźć, to po prostu gałkę oczną za pomocą prowadnic i / lub pozycji myszy. Chcę podać dokładne współrzędne X i Y.


Też chcę to wiedzieć lub jak to zrobić w Photoshopie. Zadałem o to pytanie. superuser.com/questions/345669/…
Jonny

1
Nie wydaje się być (łatwo) w GIMP możliwe bez użycia kodu Pythona, jak opisano poniżej: graphicdesign.stackexchange.com/a/6813/8841
SabreWolfy

Tak to mozliwe. Przeczytaj moją odpowiedź.
David

Odpowiedzi:


31

Obawiam się, że Gimp go nie uwzględnia, ponieważ jest to uciążliwe. Po prostu nie jest to odpowiedni sposób wyrównywania elementów podczas projektowania, choć zdaję sobie sprawę, że czasami jest przydatny jako skrót. W każdym razie najlepszym (poprawnym) podejściem są przewodniki:


A) Krok 1 - Utwórz przewodniki

  1. Przejdź do Image-> Guide-> New Guide
  2. Określ, czy chcesz i prowadnicę poziomą czy pionową
  3. Określ liczbę pikseli
  4. Powtórz procedurę dla innego poziomego lub pionowego prowadnika (możesz także zrobić więcej prowadnic, aby określić szerokość i wysokość)

Alternatywnie możesz również utworzyć prowadnice przeciągające z linijek:

  1. Przeciągnij w dół (zaczynając od górnej linijki) przewodnik po współrzędnej Y, którą chcesz.
  2. Przeciągnij w dół (zaczynając od lewej linijki) przewodnik po współrzędnej X, którą chcesz.

B) Krok 2 - Przesuń płótno

Możesz użyć ruchomego narzędzia.

  1. Wybierz swoją warstwę
  2. Przejdź do Narzędzia -> Narzędzia transformacji -> Przenieś
  3. Przeciągnij warstwę do prowadnic. Gimp da ci rękę z dokładnymi pikselami.

Jedną z zasad projektowania jest to, że w całym projekcie powinieneś mieć takie same elementy. Zmniejszenie liczby wyrównań (prowadnic) pomaga uzyskać czystszy projekt. Myślę, że właśnie dlatego gimp nie zawiera narzędzia do określania dokładnych współrzędnych. Jeśli chcesz postępować zgodnie z tą zasadą projektowania, określanie dokładnych współrzędnych jeden po drugim staje się po prostu żmudną pracą.


Dokładnie to, czego potrzebuję - dzięki. Przypadek użycia: tworzenie tapety do konfiguracji z dwoma głowicami z dwóch innych tapet. :)
smbear

21
  1. Wybierz wprowadź opis zdjęcia tutaj(narzędzie do wyrównywania).
  2. Zrób to Relative to Image.
  3. Kliknij swoją warstwę (w obszarze roboczym).
  4. Wpisz X w Offsetpolu.
  5. Kliknij Distribute/ wprowadź opis zdjęcia tutaj(strzałka w lewo).
  6. Wpisz Y w Offsetpolu.
  7. Kliknij Distribute/ wprowadź opis zdjęcia tutaj(strzałka w górę).

Otóż ​​to!


1
Działa to dla przesunięcia ujemnego.
Loda

1
Zauważ, że wydaje się, że możesz wybrać tylko górną widoczną warstwę - to znaczy, że musisz ukryć warstwy na wierzchu warstwy, która ma zostać wyrównana (Gimp 2.8.16).
Skippy le Grand Gourou,

Czy używa to jednostki pikseli? Wydaje się, że porusza mój wizerunek znacznie bardziej, niż się spodziewałbym.
palswim

@palswim Dla mnie zadziałało, gdy kliknąłem górną grupę przycisków (Wyrównaj) zamiast dolnej grupy (Rozłóż). Tak, jest mierzony w pikselach (przynajmniej w mojej konfiguracji).
Rodrigo,

20

Jest do tego skrypt, który można pobrać z rejestru wtyczek GIMP. Nazywa się to:

Przenieś warstwę do (pobierz) .

Żeby zainstalować:

  1. Przenieś skrypt do %USERPROFILE\.gimp-2.8\scriptskatalogu w systemie Windows, ~/Library/Application Support/GIMP/2.8/scriptsOS X lub ~/.gimp-2.8/scriptsLinux. ( Oficjalne instrukcje )

  2. Kliknięcia Filters-> Script-Fu-> Refresh scripts.

  3. Nowa pozycja pojawi się na dole Layermenu Move to.


Ładna pierwsza odpowiedź!
slm

Prawie idealnie! Byłoby miło, gdyby okno dialogowe parametrów używało bieżących współrzędnych warstwy jako wartości domyślnych.
Oliver Giesen

4
Musisz pobrać ten plik .scm i umieścić go w %USERPROFILE%\.gimp-2.8\scriptssystemie Windows, a następnie zrobić Filters-> Script-Fu-> Refresh Scriptsi będzie on dostępny jako najniższy element Layer->Move To
DarkWalker

3
Odpowiedź Davidsa działa bez skryptu.
Michael S.,

1
NIE działa dla przesunięcia ujemnego. a UX jest słaby (nie zachowuj ostatniej wartości itp.).
Loda,

11

Używam GIMP 2.6.11.

Za pomocą tych linii Pythona warstwę aktywną można przenieść do absolutnej pozycji, takiej jak (32, 64), z konsoli 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)

Alternatywnie, jeśli chcesz tylko przenieść zawartość warstwy:

kliknij prawym przyciskiem myszy, Warstwa> Przekształć> Przesunięcie

lub Shft + Ctrl + O


1
Powoduje to ruch pikseli w warstwie, a nie samej warstwy - muszę przenieść rzeczywistą warstwę. To, co zasugerowałeś, może działać, jeśli warstwa ma taki sam rozmiar jak płótno lub przynajmniej jest wystarczająco duża, aby nie przyciąć żadnych nieprzezroczystych pikseli w warstwie.
Scott,

@Scott: Rozumiem - przepraszam, nie znalazłem łatwiejszego sposobu, ale przynajmniej wymyśliłem, jak przenieść warstwę do absolutnej pozycji za pomocą niektórych linii Pythona.
Nicolas Kaiser,

2
Kod trzeciego wiersza powinien być img=gimp.image_list()[0]. Nie działało dla mnie.
apple16

2

Jest to bardzo wygodny sposób, aby to zrobić, ponieważ Gimp v.2.10:

  1. kliknij dwukrotnie warstwę, którą chcesz przenieść (lub kliknij ją prawym przyciskiem myszy i wybierz „Edytuj atrybuty warstwy”)

  2. pojawi się okno dialogowe „Edytuj atrybuty warstwy” i tam możesz zmienić przesunięcia X / Y zgodnie z własnymi potrzebami

Po prostu takie proste! :)

Edytuj atrybuty przesunięć warstwy X / Y

EDYTOWAĆ:

Kiedy @Michael zapytał o to w swoim komentarzu do mojej odpowiedzi, dodaję skrypt, który przenosi WSZYSTKIE warstwy obrazu o określone przesunięcia x, y.

Aby to działało, musisz utworzyć plik w folderze skryptu Gimp (w razie potrzeby skorzystaj z niektórych odnośników: tutajlub tutaj) z następującą zawartością:

; 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/")

Jeśli zrobisz to dobrze, znajdziesz nowe polecenie w menu „Warstwa” o nazwie „Przenieś wszystkie warstwy ...”, uruchom je, a pojawi się okno dialogowe, w którym możesz zdecydować o przesunięciach X i Y. Otóż ​​to.


Czy jest jakiś sposób, aby uczynić to nieco szybszym, gdy masz dużo warstw do przesunięcia (jak w setkach)? Byłoby wspaniale, gdyby to coś mogło zadokować, więc nie musiałem wychowywać go dla każdej warstwy!
Michael

1
@Michael: Cóż, myślę, że powinieneś w tym przypadku zająć się skryptami, podobnie jak zaproponował rozwiązanie Nicolas Kaiser, ale zapętlając warstwy obrazów ... Właśnie edytowałem swoją odpowiedź, aby pokazać ci, jak to zrobić. (Udzieliłbym na to osobnej odpowiedzi, ale OP poprosił konkretnie o przesunięcie JEDNEJ warstwy, nie wszystkich. Jeśli zadasz nowe pytanie, chętnie odpowiem tam, dodając kilka zrzutów ekranu i całą resztę; - D) Na zdrowie
danicotra
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.