ย้ายเลเยอร์ไปยังตำแหน่ง X, Y เฉพาะใน Gimp


58

ฉันจะย้ายเลเยอร์ไปยังตำแหน่ง XY เฉพาะภายในผืนผ้าใบใน Gimp ได้อย่างไร

ขณะนี้วิธีเดียวที่ฉันสามารถค้นหาได้คือการใช้ลูกตาด้วยไกด์และ / หรือตำแหน่งเมาส์ ฉันต้องการระบุพิกัด X และ Y ที่แน่นอน


ฉันต้องการทราบสิ่งนี้ด้วยหรือจะทำใน Photoshop ฉันทำคำถามนั้น superuser.com/questions/345669/…
Jonny

1
ดูเหมือนจะเป็นไปไม่ได้ (ง่าย) ใน GIMP โดยไม่ต้องใช้รหัส Python ดังรายละเอียดด้านล่าง: graphicdesign.stackexchange.com/a/6813/8841
SabreWolfy

ใช่มันเป็นไปได้ อ่านคำตอบของฉัน
David

คำตอบ:


31

ฉันกลัวว่า Gimp จะไม่รวมเพราะน่าเบื่อ มันไม่ใช่วิธีการจัดองค์ประกอบที่เหมาะสมเมื่อคุณออกแบบถึงแม้ว่าฉันจะรู้ว่าบางครั้งมันมีประโยชน์ในฐานะทางลัด อย่างไรก็ตามวิธีที่ดีที่สุด (ถูกต้อง) อยู่กับคู่มือ:


A) ขั้นตอนที่ 1 - สร้างคำแนะนำ

  1. ไปที่รูปภาพ -> Guide-> คู่มือใหม่
  2. ระบุว่าคุณต้องการแนวทางแนวนอนหรือแนวตั้ง
  3. ระบุจำนวนพิกเซล
  4. ทำซ้ำขั้นตอนสำหรับ Guide แนวนอนหรือแนวตั้งอื่น (คุณสามารถทำคู่มือเพิ่มเติมเพื่อระบุความกว้างและความสูง)

นอกจากนี้คุณยังสามารถสร้างคำแนะนำการลากจากผู้ปกครอง:

  1. ลากลง (เริ่มต้นจากไม้บรรทัดด้านบน) คู่มือไปยังพิกัด Y ที่คุณต้องการ
  2. ลากลง (เริ่มต้นจากไม้บรรทัดซ้าย) คำแนะนำไปยังพิกัด X ที่คุณต้องการ

B) ขั้นตอนที่ 2 - ย้ายผืนผ้าใบ

คุณสามารถใช้เครื่องมือย้าย

  1. เลือกเลเยอร์ของคุณ
  2. ไปที่เครื่องมือ -> เปลี่ยนเครื่องมือ -> ย้าย
  3. ลากเลเยอร์ไปที่ไกด์ Gimp จะมอบพิกเซลที่แน่นอนให้กับคุณ

หนึ่งในหลักการออกแบบคือคุณควรให้สิ่งต่าง ๆ สอดคล้องกันในโครงการทั้งหมดของคุณ การลดจำนวนการจัดแนว (คำแนะนำ) ช่วยให้คุณได้รับการออกแบบที่สะอาดยิ่งขึ้น ฉันคิดว่านี่เป็นสาเหตุที่ gimp ไม่ได้รวมเครื่องมือในการระบุพิกัดที่แน่นอน หากคุณต้องการทำตามหลักการออกแบบนี้การระบุพิกัดที่แน่นอนทีละคนกลายเป็นเพียงแรงงานที่น่าเบื่อ


สิ่งที่ฉันต้องการจริงๆ - ขอบคุณ ใช้กรณี: การสร้างวอลล์เปเปอร์สำหรับการตั้งค่าแบบสองหัวจากวอลล์เปเปอร์อื่น ๆ อีกสองแบบ :)
smbear

22
  1. เลือกป้อนคำอธิบายรูปภาพที่นี่(เครื่องมือการจัดตำแหน่ง)
  2. Relative to Imageทำให้มัน
  3. คลิกที่เลเยอร์ของคุณ (ในพื้นที่วาดรูป)
  4. ป้อน X ในOffsetฟิลด์
  5. คลิกที่Distribute/ ป้อนคำอธิบายรูปภาพที่นี่(ลูกศรซ้าย)
  6. ป้อน Y ในOffsetฟิลด์
  7. คลิกที่Distribute/ ป้อนคำอธิบายรูปภาพที่นี่(ลูกศรขึ้น)

แค่นั้นแหละ!


1
งานนี้สำหรับการชดเชยเชิงลบ
Loda

1
โปรดทราบว่าดูเหมือนว่าคุณสามารถเลือกเลเยอร์ที่มองเห็นได้ด้านบนเท่านั้นนั่นคือต้องซ่อนเลเยอร์ที่อยู่ด้านบนของเลเยอร์เพื่อจัดตำแหน่ง (gimp 2.8.16)
Skippy le Grand Gourou

สิ่งนี้ใช้หน่วยพิกเซลหรือไม่ ดูเหมือนว่าจะย้ายภาพของฉันไปไกลเกินคาด
palswim

@palswim สำหรับฉันมันใช้งานได้เมื่อฉันคลิกที่ปุ่มกลุ่มบนสุด (จัดเรียง) แทนที่จะเป็นกลุ่มล่าง (แจกจ่าย) ใช่วัดเป็นพิกเซล (อย่างน้อยในการกำหนดค่าของฉัน)
Rodrigo

20

มีสคริปต์ในการทำเช่นนี้ที่สามารถดาวน์โหลดได้จากรีจิสทรีปลั๊กอิน GIMP มันถูกเรียกว่า:

ย้ายชั้น (ดาวน์โหลด)

ติดตั้ง:

  1. ย้ายสคริปต์ไปยัง%USERPROFILE\.gimp-2.8\scriptsไดเรกทอรีบน Windows ~/Library/Application Support/GIMP/2.8/scriptsบน OS X หรือ~/.gimp-2.8/scriptsบน Linux ( คำแนะนำอย่างเป็นทางการ )

  2. คลิกFilters-> ->Script-FuRefresh scripts

  3. รายการเมนูใหม่จะปรากฏขึ้นที่ด้านล่างของเมนูLayerMove to


คำตอบแรกที่ดี!
slm

เกือบจะสมบูรณ์แบบ! จะดีถ้ากล่องโต้ตอบพารามิเตอร์ใช้พิกัดปัจจุบันของเลเยอร์เป็นค่าเริ่มต้น
Oliver Giesen

4
คุณจำเป็นต้องดาวน์โหลดไฟล์. scm และนำไปไว้%USERPROFILE%\.gimp-2.8\scriptsใน Windows จากนั้นทำFilters-> Script-Fu-> Refresh Scriptsและจะสามารถใช้งานได้ตามรายการด้านล่างLayer->Move To
DarkWalker

3
คำตอบของดาวิดจะทำงานโดยไม่มีสคริปต์
Michael S.

1
ไม่ทำงานสำหรับการชดเชยเชิงลบ และ UX ไม่ดี (อย่าเก็บค่าสุดท้าย ฯลฯ )
Loda

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)

หรือถ้าคุณต้องการย้ายเนื้อหาของเลเยอร์:

คลิกขวา, เลเยอร์> แปลง> ออฟเซ็ต

หรือ Shft + Ctrl + O


1
สิ่งนี้ทำให้พิกเซลภายในเลเยอร์ย้ายมากกว่าชั้นเอง - ฉันต้องย้ายเลเยอร์จริง สิ่งที่คุณแนะนำอาจใช้งานได้หากเลเยอร์มีขนาดเท่ากับผ้าใบหรืออย่างน้อยใหญ่พอที่จะไม่ถ่ายภาพพิกเซลที่ไม่โปร่งใสภายในเลเยอร์
สกอตต์

@Scott: ฉันเห็น - ขอโทษที่ฉันไม่พบวิธีที่ง่ายขึ้น แต่อย่างน้อยฉันก็หาวิธีย้ายเลเยอร์ไปยังตำแหน่งที่แน่นอนด้วย Python บางบรรทัด
Nicolas Kaiser

2
img=gimp.image_list()[0]สามบรรทัดของรหัสที่คุณควรจะเป็น _ ไม่ทำงานสำหรับฉัน
apple16

3

มีวิธีที่สะดวกมากในการทำสิ่งนี้ตั้งแต่ Gimp v.2.10:

  1. ดับเบิลคลิกที่เลเยอร์ที่คุณต้องการย้าย (หรือคลิกขวาที่เลเยอร์แล้วเลือก "แก้ไขคุณสมบัติของเลเยอร์")

  2. กล่องโต้ตอบ "แก้ไขเลเยอร์คุณลักษณะ" จะปรากฏขึ้นและคุณสามารถเปลี่ยนการชดเชย X / Y ตามความต้องการของคุณได้

ง่าย ๆ อย่างนั้น! :)

แก้ไขคุณสมบัติชดเชย X / Y ของเลเยอร์

แก้ไข:

เมื่อ @Michael ถามเกี่ยวกับความคิดเห็นในคำตอบของฉันฉันกำลังเพิ่มสคริปต์ที่จะย้ายเลเยอร์ภาพทั้งหมดตามที่ระบุ x, y offsets

เพื่อให้มันใช้งานได้คุณต้องสร้างไฟล์ในโฟลเดอร์สคริปต์ 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 ออฟเซ็ต แค่นั้นแหละ.


มีวิธีใดบ้างที่จะทำให้เรื่องนี้เร็วขึ้นเล็กน้อยเมื่อคุณมีเลเยอร์จำนวนมากให้ย้าย (เหมือนเป็นร้อย) มันจะดีถ้าสิ่งนี้สามารถเทียบท่าได้ดังนั้นฉันไม่ต้องนำขึ้นทุกชั้น!
Michael

1
@Michael: อืมฉันคิดว่าคุณควรไปกับสคริปต์ในกรณีนี้คล้ายกับ Nicolas Kaiser แนะนำวิธีแก้ปัญหา แต่วนรอบเลเยอร์ภาพ ... ฉันเพิ่งแก้ไขคำตอบของฉันเพื่อแสดงให้คุณดูได้อย่างไร (ฉันจะทำคำตอบแยกต่างหากสำหรับมัน แต่ OP ขอให้ย้ายเฉพาะเลเยอร์หนึ่งไม่ใช่ทั้งหมดถ้าคุณถามคำถามใหม่สำหรับเรื่องนี้ฉันยินดีที่จะตอบที่นั่นโดยเพิ่มหน้าจอบางส่วนและส่วนที่เหลือทั้งหมด - D) ไชโย
danicotra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.