Переместить слой в определенную позицию X, Y в Gimp

58

Как переместить слой в определенную позицию XY на холсте в Gimp?

В настоящее время я могу найти только один способ - это смотреть с помощью направляющих и / или положения мыши. Я хочу указать точные координаты X и Y.

Скотт
источник
Я тоже хочу это знать, или как это сделать в Photoshop. Я задал вопрос для этого. superuser.com/questions/345669/…
Джонни
1
Похоже, что это невозможно (легко) в GIMP без использования кода Python, как подробно описано ниже: graphicdesign.stackexchange.com/a/6813/8841
SabreWolfy
Да, это возможно. Прочитайте мой ответ.
Дэвид

Ответы:

31

Боюсь, что Gimp не включает его, потому что это утомительно. Это просто неподходящий способ выравнивания элементов при проектировании, хотя я признаю, что иногда это полезно в качестве кратчайшего пути. В любом случае, лучший (правильный) подход - с помощью руководств:


А) Шаг 1 - Создать направляющие

  1. Перейдите в Image-> Guide-> New Guide
  2. Укажите, хотите ли вы и горизонтальную или вертикальную направляющую
  3. Укажите количество пикселей
  4. Повторите процедуру для другой горизонтальной или вертикальной направляющей (вы также можете сделать больше направляющих для указания ширины и высоты)

Кроме того, вы также можете создавать направляющие, перетаскивая их из линейки:

  1. Перетащите (начиная с верхней линейки) направляющую до нужной вам координаты Y.
  2. Перетащите (начиная с левой линейки) направляющую до нужной вам координаты X.

Б) Шаг 2 - Переместить холст

Вы можете использовать движущийся инструмент.

  1. Выберите свой слой
  2. Перейдите в Инструменты -> Инструменты трансформации -> Переместить
  3. Перетащите слой к направляющим. Gimp даст вам руку с точными пикселями.

Одним из принципов дизайна является то, что вы должны выровнять вещи во всем проекте. Уменьшение количества юстировок (направляющих) поможет вам получить более чистый дизайн. Я думаю, именно поэтому GIMP не включает в себя инструмент для указания точных координат. Если вы хотите следовать этому принципу проектирования, указание точных координат по очереди становится просто утомительным трудом.

toto_tico
источник
Именно то, что мне нужно - спасибо. Вариант использования: создание обоев для установки с двумя головками из двух других обоев. :)
smbear
22
  1. Pick введите описание изображения здесь(инструмент выравнивания).
  2. Сделай это Relative to Image.
  3. Нажмите на свой слой (на холсте).
  4. Введите X в Offsetполе.
  5. Нажмите на Distribute/ введите описание изображения здесь(стрелка влево).
  6. Введите Y в Offsetполе.
  7. Нажмите на Distribute/ введите описание изображения здесь(стрелка вверх).

Это оно!

Дэвид
источник
1
Эта работа для отрицательного смещения.
Лода
1
Обратите внимание, что кажется, что вы можете выбрать только верхний видимый слой, то есть нужно скрыть слои поверх слоя для выравнивания (gimp 2.8.16).
Скиппи ле Гран Гуру
Использует ли это единицу пикселей? Кажется, мой имидж переместился гораздо больше, чем я ожидал.
Palswim
@palswim Для меня это сработало, когда я нажал верхнюю группу кнопок (Align) вместо нижней группы (Distribute). Да, измеряется в пикселях (по крайней мере, в моей конфигурации).
Родриго
20

Для этого есть скрипт, который можно скачать из реестра плагинов GIMP. Это называется:

Переместить слой в (скачать) .

Установить:

  1. Переместите сценарий в %USERPROFILE\.gimp-2.8\scriptsкаталог в Windows, ~/Library/Application Support/GIMP/2.8/scriptsOS X или ~/.gimp-2.8/scriptsLinux. ( Официальные инструкции )

  2. Клики Filters-> Script-Fu-> Refresh scripts.

  3. Новый пункт меню появится в нижней части Layerменю Move to.

garyb
источник
Хороший первый ответ!
Slm
Практически идеально! Было бы хорошо, если бы диалог параметров использовал текущие координаты слоя в качестве значений по умолчанию.
Оливер Гизен
4
Вам нужно скачать этот файл .scm и поместить его в %USERPROFILE%\.gimp-2.8\scriptsWindows, затем сделать Filters-> Script-Fu->, Refresh Scriptsи он будет доступен как самый нижний элемент Layer->Move To
DarkWalker
3
Ответ Давида делает работу без сценария.
Майкл С.
1
НЕ работает для отрицательного смещения. и UX плохой (не сохраняйте последнее значение и т. д.).
Лода
11

Я использую GIMP 2.6.11.

С помощью этих строк Python активный слой можно переместить в абсолютную позицию, например (32, 64), из консоли 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)

В качестве альтернативы, если вы хотите только переместить содержимое слоя:

щелкните правой кнопкой мыши, Layer> Transform> Offset

или Shft + Ctrl + O

Николас Кайзер
источник
1
Это заставляет перемещаться пиксели в слое, а не сам слой - мне нужно переместить реальный слой. То, что вы предложили, может работать, если слой имеет тот же размер, что и холст, или, по крайней мере, достаточно большой, чтобы не обрезать непрозрачные пиксели внутри слоя.
Скотт
@ Скотт: я вижу - извините, я не нашел более простой способ, но, по крайней мере, я понял, как переместить слой в абсолютную позицию с некоторыми строками Python.
Николас Кайзер
2
Третья строка вашего кода должна быть img=gimp.image_list()[0]. _ Не работал для меня.
apple16
3

Существует очень удобный способ сделать это доступным, начиная с Gimp v.2.10:

  1. дважды щелкните по слою, который вы хотите переместить (или щелкните по нему правой кнопкой мыши и выберите «Редактировать атрибуты слоя»)

  2. Откроется диалоговое окно «Редактировать атрибуты слоя», в котором вы можете изменить смещения X / Y в соответствии с вашими потребностями.

Просто так просто! :)

Редактировать атрибуты смещения X / Y слоя

РЕДАКТИРОВАТЬ:

Как @Michael спросил об этом в своем комментарии к моему ответу, я добавляю скрипт, который будет перемещать ВСЕ слои изображения с указанным смещением x, y.

Чтобы это работало, вам нужно создать файл в папке скриптов Gimp (некоторые ссылки для этого, если вам это нужно: Вотили Вот) со следующим содержимым:

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

Если вы все сделаете правильно, вы найдете новую команду в меню «Слой» под названием «Переместить все слои ...», запустите ее, и появится диалоговое окно, позволяющее вам решить смещения по X и Y. Вот и все.

danicotra
источник
Любой способ сделать это немного быстрее, когда у вас есть много слоев для перемещения (как в сотнях)? Было бы здорово, если бы эта штука могла пристыковаться, поэтому мне не нужно было поднимать ее для каждого слоя!
Майкл
1
@Michael: Ну, я полагаю, что в этом случае вам следует заняться некоторыми сценариями, аналогично предложенному Николасом Кайзером решению, но зацикливанию на слоях изображений ... Я просто отредактировал свой ответ, чтобы показать вам, как, посмотрите. (Я бы сделал отдельный ответ на это, но ОП попросил переместить ОДИН слой, а не все. Если бы вы задали новый вопрос для этого, я был бы рад ответить, добавив несколько скриншотов и все остальное; - D) Приветствия
Даникотра