Bir katmanı Gimp'te belirli bir X, Y konumuna taşıma


58

Bir katmanı Gimp'teki tuval içinde belirli bir XY konumuna nasıl taşırım?

Şu anda bulabildiğim tek yol, rehberleri ve / veya fare konumlarını göz küresi yapmak. Tam X ve Y koordinatlarını belirtmek istiyorum.


Bunu da bilmek istiyorum, ya da Photoshop'ta nasıl yapılacağını. Bunun için bir soru yaptım. superuser.com/questions/345669/…
Jonny

1
Aşağıdaki gibi Python kodunu kullanmadan GIMP'de (kolay) mümkün görünmüyor: graphicdesign.stackexchange.com/a/6813/8841
SabreWolfy

Evet mümkün. Cevabımı oku.
David

Yanıtlar:


31

Korkarım Gimp bunu içermez çünkü sıkıcıdır. Tasarım yaparken öğeleri hizalamak uygun bir yöntem değildir, ancak bazen kısa yol olarak kullanılabileceğini biliyorum. Neyse, en iyi (doğru) yaklaşım rehberlerledir:


A) Adım 1 - Kılavuzları oluşturun

  1. Image-> Guide-> New Guide'a gidin
  2. İsterseniz, yatay veya dikey kılavuz
  3. Piksel sayısını belirtin
  4. Prosedürü başka bir yatay veya dikey Kılavuz için tekrarlayın (genişlik ve yükseklik belirlemek için daha fazla kılavuz da yapabilirsiniz)

Alternatif olarak, cetvellerden sürükleyerek kılavuzlar da oluşturabilirsiniz:

  1. İstediğiniz Y koordinatına bir kılavuzu (üst cetvelden başlayarak) aşağı sürükleyin.
  2. İstediğiniz X koordinatına (sol cetvelden başlayarak) bir kılavuz aşağı sürükleyin.

B) Adım 2 - Tuvali hareket ettir

Hareketli aracı kullanabilirsiniz.

  1. Katmanınızı seçin
  2. Araçlar -> Dönüştür Araçları -> Taşı
  3. Katmanı kılavuzlara sürükleyin. Gimp size tam piksellerle yardım eder.

Tasarım ilkelerinden biri, tüm projenizde bazı şeylerin aynı hizada olması gerektiğidir. Hizalama sayısının (kılavuzların) azaltılması, daha temiz bir tasarım elde etmenize yardımcı olur. Bu yüzden gimp'in kesin koordinatları belirleyen bir araç içermediğini düşünüyorum. Kesin koordinatları tek tek belirlemek bu tasarım prensibini takip etmek istiyorsanız, sadece bir sıkıcı emek haline gelir.


Tam ihtiyacım olan şey - teşekkürler. Kullanım örneği: diğer iki duvar kağıdından çift kafalı kurulum için bir duvar kağıdı oluşturmak. :)
smbear 11

22
  1. Seç görüntü tanımını buraya girin(hizalama aracı).
  2. Make it Relative to Image.
  3. Katmanınıza tıklayın (tuvalde).
  4. OffsetAlana X girin .
  5. Distribute/ görüntü tanımını buraya girin(Sol ok) düğmesine tıklayın .
  6. OffsetAlana Y girin .
  7. Distribute/ görüntü tanımını buraya girin(Yukarı ok) düğmesine tıklayın .

Bu kadar!


1
Bu negatif sapma için çalışıyor.
Loda

1
Sadece görünen en üst katmanı seçebileceğinize dikkat edin - yani, katmanları hizalanacak katmanın üstüne katlamak zorunda kalırsınız (pim 2.8.16).
Skippy le Grand Gourou,

Bu piksel birimini kullanıyor mu? İmajımı beklediğimden çok daha fazla etkiliyor gibi görünüyor.
palswim

@palswim Benim için alt grup yerine (Dağıt) üstteki düğme grubuna (Hizala) tıkladığımda işe yaradı. Evet, piksel cinsinden ölçülür (en azından benim yapılandırmamda).
Rodrigo

20

Bunu yapmak için GIMP Eklentisi kayıt defterinden indirebileceğiniz bir komut dosyası var. Denir:

Katmanı Taşı (indir) .

Yüklemek:

  1. Komut dosyasını %USERPROFILE\.gimp-2.8\scriptsWindows, ~/Library/Application Support/GIMP/2.8/scriptsOS X veya ~/.gimp-2.8/scriptsLinux'ta dizine taşıyın . ( Resmi talimatlar )

  2. Tıklamalar Filters-> Script-Fu-> Refresh scripts.

  3. Yeni menü öğesi altındaki görünecektir Layermenü Move to.


Güzel ilk cevap!
slm

Neredeyse mükemmel! Eğer parametre diyalogu tabakanın geçerli koordinatlarını varsayılan değerler olarak kullandıysa iyi olurdu.
Oliver Giesen

4
Bu .scm dosyasını indirmeniz ve Windows'a yüklemeniz gerekir %USERPROFILE%\.gimp-2.8\scripts, sonra Filters-> Script-Fu-> yapın Refresh Scriptsve en düşük madde olarak mevcut olacak Layer->Move To
DarkWalker

3
Davids cevap iş senaryo olmadan yapar.
Michael S.

1
Negatif kayma için çalışmıyor. ve UX kötüdür (son değeri saklamayın, vb.).
Loda

11

GIMP 2.6.11 kullanıyorum.

Bu Python satırlarıyla, aktif katman Python konsolundan (32, 64) gibi mutlak bir konuma taşınabilir:

>>> 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)

Alternatif olarak, yalnızca katmanın içeriğini taşımak istiyorsanız:

sağ tıklayın, Katman> Dönüştür> Ofset

veya Shft + Ctrl + O


1
Bu , katman içindeki piksellerin katman yerine hareket etmesine neden olur - gerçek katmanı taşımam gerekiyor. Önerdiğiniz şey, katman tuvalle aynı boyuttaysa veya en azından katmandaki saydam olmayan pikselleri kırpmayacak kadar büyükse işe yarayabilir.
Scott

@Scott: Görüyorum - üzgünüm daha kolay bir yol bulamadım, ama en azından bazı Python çizgileriyle katmanı mutlak bir konuma nasıl taşıyacağımı öğrendim.
Nicolas Kaiser

2
Üç numaralı kodunuz olmalı img=gimp.image_list()[0]. _ Benim için işe yaramadı.
apple16,

3

Gimp v.2.10’dan bu yana bunu yapmanın çok uygun bir yolu var:

  1. Taşımak istediğiniz katmanı çift tıklayın (veya sağ tıklayın ve "Katman Özelliklerini Düzenle" yi seçin)

  2. "Katman Özelliklerini Düzenle" iletişim kutusu görünecek ve orada X / Y ofsetlerini ihtiyaçlarınıza göre değiştirebilirsiniz

Böyle basitçe kolay! :)

Katman X / Y Ofsetlerini Düzenleme Nitelikleri

DÜZENLE:

@Michael cevabımdaki yorumunda sorduğu gibi, TÜM görüntü katmanlarını belirtilen x, y ofsetlerine göre hareket ettirecek bir komut dosyası ekliyorum.

Çalışması için Gimp script klasöründe (buna ihtiyaç duyarsanız bazı referanslar: İşteveya İşte) aşağıdaki içeriği içeren bir dosya oluşturmanız gerekir :

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

Doğru yaparsanız, "Tüm katmanları taşı ..." adlı "Katman" menüsünde yeni bir komut bulacaksınız, X ve Y ofsetlerine karar vermenize izin veren bir iletişim kutusu açılacaktır. Bu kadar.


Taşıyacak çok katmanınız olduğunda bunu biraz daha hızlı hale getirmenin bir yolu var mı? Eğer bu şey sabitlenebilseydi harika olurdu, bu yüzden her katmana çıkarmak zorunda kalmamıştım!
Michael,

1
@Michael: Sanırım, bu durumda bazı senaryolarla gitmelisin, Nicolas Kaiser'in önerdiği gibi, fakat görüntü katmanlarında döngü var ... Size nasıl göründüğünü göstermek için cevabımı düzelttim. (Bunun için ayrı bir cevap verirdim, ancak OP, hepsi için değil, özellikle BİR katmanın taşınmasını istedi. Bunun için yeni bir soru sorarsanız, orada bazı ekran görüntüleri ve diğerlerini ekleyerek cevap vermekten memnuniyet duyarım; D) Şerefe
danicotra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.