Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?


Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Strony: [1]
DrukujPobierz PDF
Autor Wątek: [ROZ] Skrypt do operacji na warstwach  (Przeczytany 1675 razy)
0 użytkowników i 1 Gość przegląda ten wątek.
mario_w
Nowicjusz

Reputacja: 0 Offline Offline

Wiadomości: 5
Galeria Użytkownika

mario_w


Zobacz profil
« : 21.08.2010, 10:05:05 »

Witam

Piszę sobie skrypt który automatyzuje mi operacje na obrazku i napotkałem dwa problemy do których nie mogę znaleźć rozwiązania (ponieważ dopiero raczkuję w Scheme to obawiam się że mogą one być bardzo podstawowe )

Mianowicie chciałbym wykonać takie operacje:

1. spłaszcz obrazek
2. dodaj warstwe tła (o szerokości i wysokości większej niż warstwa obrazka)
3. odwróć kolejność warstw(nowa duża warstwa ma być na dole)
4. zwiększ wielkość obszaru roboczego
5. wyśrodkuj warstwy względem siebie (ma stworzyć się ramka wokół obrazka)

Nie za bardzo mogę poradzić sobie z punktami 3-5, a szczególnie z dwoma ostatnimi.

1. Jaka funkcja odpowiada opcji "Dopasuj płótno do warsttw" (Fit Canvas to Layers ) - funkcja której działanie wygląda na podobne to gimp-image-resize-to-layers, ale mam wrażenie że to nie ta.

2. Jak programowo wyśrodkować dwie warstwy jedna względem drugiej?

Jeśli ktoś z Was mógłby coś podpowiedzieć to będę bardzo wdzięczny. A może znacie jakiś kod skryptu script-fu, który wykonuje podobne operacje bym mógł podpatrzeć kod?

Pozdrawiam i z góry dzięki
mw
« Ostatnia zmiana: 24.08.2010, 20:29:54 wysłane przez Ziomioslaw » Zapisane
Ziomioslaw
Administrator

Reputacja: 46 Offline Offline

Płeć: Mężczyzna
GIMP: 2.10
JID: ziomioslaw@jabber.org
Licencja: Copyright
Wiadomości: 7 461
Galeria Użytkownika


Cyklista Apokalipsy


Zobacz profil
« Odpowiedz #1 : 21.08.2010, 10:18:53 »

Ad 1.
Dlaczego masz wrażenie, że to nie gimp-image-resize-to-layers? Z opisu wynika, że to to.

Ad 2.
Nie ma to wbudowanej funkcji - a przynajmniej ja o niej nie wiem - ale da się to zrobić, przez umieszczenie warstwy na wyliczonych współrzędnych. To będzie coś takiego:

x2 = x1 + (s2 - s1)/2
y2 = y1 + (w2 - w1)/2

Gdzie: x, y, s, w oznaczają odpowiednio: położenie x, położenie y, szerokość i wysokość, a numerki do której warstwy się odwołują.

Ad 3.
Poszukaj, na tym forum, w internecie, możesz wklepać nazwę funkcji, zawsze się coś tam znajdzie...
Zapisane
mario_w
Nowicjusz

Reputacja: 0 Offline Offline

Wiadomości: 5
Galeria Użytkownika

mario_w


Zobacz profil
« Odpowiedz #2 : 22.08.2010, 09:07:18 »

Ziomioslaw serdecznie dziękuję za bardzo pomocną i rzeczową odpowiedź.

Zamianę warstw już sobie załatwiłem i nawet mi zadziałała.

Mam natomiast kilka nowych pytań odnośnie programowego operowania na warstwach,

1. Czy jeśli w obrazie programowo spłaszczę warstwy a następnie wywołam na nim operację (gimp-image-get-active-layer image) to czy dostanę tą właśnie jedyną istniejącą tam warstwę? Bo problem jest taki że przed dodaniem nowej warstwy potrzebuje przeczytać pewne atrybuty z tej starej a  na początku mam referencję tylko do obrazka.

2. Jeśli opisany przeze mnie w punkcie 1 jest dobrym sposobem dostania się do warstwy, która już istnieje w obrazku to jak z tej warstwy wydostać parametry opisane przez Ciebie (takie jak jej rozmiar i położenie). Nie znalazłem funkcji które zwracałyby te wartości dla warstwy.

3. W jaki sposób nakazać warstwie przesunięcie się do określonej pozycji. Tutaj też nie udało  mi się namierzyć funkcji której nazwa by wskazywała na coś takiego.

Zapisane
Ziomioslaw
Administrator

Reputacja: 46 Offline Offline

Płeć: Mężczyzna
GIMP: 2.10
JID: ziomioslaw@jabber.org
Licencja: Copyright
Wiadomości: 7 461
Galeria Użytkownika


Cyklista Apokalipsy


Zobacz profil
« Odpowiedz #3 : 22.08.2010, 11:59:53 »

Ad 1. Gimp-image-get-active-layer zwraca aktywną (wybraną z listy warstw przez użytkownika), o ile jakaś jest (np. może być wybrany Kanał). Przy okazji, funkcja spłaszczająca (gimp-image-flatten) zwraca tą wynikową warstwę. Po spłaszczeniu raczej nie dobierzesz się do poprzednich warstw, bo przestają istnieć. Do pobierania warstw służą też funkcje: gimp-image-get-layer-*.

Ad 2. Wydaje mi się, że to będą te:
gimp-drawable-width - szerokość
gimp-drawable-height - wysokość
gimp-drawable-offsets - położenie względem obrazka (image).

Ad 3. gimp-layer-set-offsets

Napisz jak wyszło, bo... ...nie chciało mi się sprawdzać:P
Zapisane
mario_w
Nowicjusz

Reputacja: 0 Offline Offline

Wiadomości: 5
Galeria Użytkownika

mario_w


Zobacz profil
« Odpowiedz #4 : 24.08.2010, 20:19:09 »

Ziomioslaw dziękuję za pomoc. Wszystko fajnie zadziałało.

PS. Jeśli ktoś byłby zainteresowany to wrzucam swój skrypt, który na podstawie aktualnie załadowanego obrazu tworzy obrazek do przygotowany do zamieszczenia go na www.
Skrypt skaluje i spłaszcza oryginalny obraz, zmienia jego rozdzielczosc, dodaje biały obszar naokoło obrazka oraz lekko go podostrza.

; Define the function:

(define (script-fu-obrazek-galerii-www inImage)
  (let (
       (theImage 0)
       (theLayer 0)
       (theWidth 0)
       (theHeight 0)
       )
  (gimp-image-undo-group-start inImage)
  (gimp-selection-all inImage)
  (set! theImage (car (gimp-image-duplicate inImage)))
  ;Splaszczenie warstw
  (set! theLayer (car (gimp-image-flatten theImage)))
  
  ;poczatek skalowania obrazka
   (define max-width 700)
   (define max-height 700)

   (define image-width (car (gimp-image-width theImage)))
   (define image-height (car (gimp-image-height theImage)))

   (if (< image-height image-width)
   (define scale-factor (/ image-width max-width))
   (define scale-factor (/ image-height max-height)))

   (define final-width (/ image-width scale-factor))   
   (define final-height (/ image-height scale-factor))

   (gimp-image-set-resolution theImage 72 72)
   (gimp-image-scale theImage final-width final-height)
  ;koniec skalowania obrazka

  ;dodanie nowej warstwy
   (define white-color '(255 255 255))   
   (set! theWidth (+ 20 (car (gimp-image-width theImage))))
   (set! theHeight (+ 20 (car (gimp-image-height theImage))))
   (gimp-palette-set-foreground white-color)
    ; Utworz nowa warstwe
   (define new-layer (car (gimp-layer-new theImage theWidth theHeight RGB "layer 1" 100 NORMAL)))
  ; Nazwij warstwe
   (gimp-layer-set-name new-layer "warstwa-tla")
  ; dodaj nowa warstwe do obrazka
    (gimp-image-add-layer theImage new-layer 0)   
   ;nowa wieksza warstwe umiesc na dole stosu
   (gimp-image-lower-layer theImage new-layer)
   ;nowa warstwa - wypelnij kolorem bialym
   ;(gimp-drawable-fill new-layer WHITE-FILL)
   ;Zwiekszanie obszaru roboczego do wielkosci warstwy - fit to canvas
   (gimp-image-resize-to-layers theImage)   
   
   ;nowa warstwa - wypelnij kolorem bialym
   (gimp-drawable-fill new-layer WHITE-FILL)
   (gimp-image-set-active-layer theImage theLayer)
   ;koniec obslugi dodania nowej warstwy
  
   ;Srodkowanie warstw
   (define deltaX (- theWidth (car (gimp-drawable-width theLayer))))
   (define deltaY (- theHeight(car (gimp-drawable-height theLayer))))
    
   (define offX (/ deltaX 2))
   (define offY (/ deltaY 2))
   ;centrowanie warstw
   (gimp-layer-set-offsets theLayer offX offY)
   
    ;lekkie podostrzenie
    (plug-in-sharpen 1 theImage theLayer 5)
  (gimp-image-clean-all theImage)
  (gimp-display-new theImage)
  
  (gimp-selection-none inImage)
  (gimp-image-undo-group-end inImage)
  (gimp-displays-flush theImage)
  )
)

(script-fu-register "script-fu-obrazek-galerii-www"
  "Obrazek galerii WWW"
  "Tworzy obrazek do opublikowania na WWW"
  "mw"
  "mw"
  "2010"
  "RGB* GRAY*"
  SF-IMAGE      "The image"     0
)

(script-fu-menu-register "script-fu-obrazek-galerii-www"
                        "<Toolbox>/Xtns/Script-Fu")
Zapisane
Strony: [1]
DrukujPobierz PDF
Polskie Forum Użytkowników GIMP-aHyde zoneArchiwum[Archiwum] Pomocna dłoń - GIMPWątek: [ROZ] Skrypt do operacji na warstwach
Skocz do: