Polskie Forum Użytkowników GIMP-a

Hyde zone => [Archiwum] Pomocna dłoń - GIMP => Wątek zaczęty przez: wiktor93 on 10.02.2012, 00:17:26



Tytuł: [ROZ] Automatyzacja pracy - skrypt?
Wiadomość wysłana przez: wiktor93 on 10.02.2012, 00:17:26
Witam, da się zrobić tak, żeby zaznaczyć kilka warstw (ewentualnie jedną warstwę), zrobić obramowanie o grubości jeden dla tekstu w nich zawartego (lub kanału alfa), następnie usunąć te warstwy i zaznaczenie wypełnić na czarno? Nie wiem czy istnieją dla gimpa jakieś skrypty czy coś...


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 10.02.2012, 17:23:38
Tak istnieją skrypty do GIMPa - Script-Fu.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 10.02.2012, 21:24:19
A mógłby ktoś to napisać? Czy to z tym trochę roboty jest?


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 10.02.2012, 22:12:53
Musisz spisać konkretną listę poleceń, wtedy się pomyśli.
Taka lista to na przykład:
 1. zaznaczenie kanału alfa
 2. wypełnienie kolorem
 3. duplikacja aktualnej warstwy
itd...


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 12.02.2012, 17:55:34
Ok. Chodzi konkretnie o zaznaczoną warstwę (bądź kilka, jeżeli się da)

1. Zaznaczenie kanału alfa
2. Obramowanie zaznaczenia grubością 1
3. Usunięcie warstw(y)
4. Wypełnienie w warstwie tła zaznaczenia na czarno.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 13.02.2012, 21:34:25
Kod:
(define (script-fu-make-border image drawable)
(gimp-image-undo-group-start image)
(gimp-selection-layer-alpha drawable)
(gimp-selection-border image 1)
(gimp-image-remove-layer image drawable)
(gimp-palette-set-default-colors)
(gimp-edit-fill (car (gimp-image-get-active-layer image)) FOREGROUND-FILL)
(gimp-displays-flush)
(gimp-image-undo-group-end image)
)

(script-fu-register "script-fu-make-border"
_"<Image>/Script-Fu/Make border"
"See http://www.gimpuj.info/index.php/topic,55029.html"
"Ziomioslaw"
"Ziomioslaw"
"2012-02-13"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
)

Proszę, skrypt nie jest idiotoodporny, więc radzę uważać.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 14.02.2012, 23:51:19
Prawie idealnie :) Już teraz wielkie dzięki. Ale jeśli mogę jeszcze chwilę pomarudzić, to dlaczego przy tle i dwóch warstwach tekstu już nieraz nie wypełnia na czarno? Chyba jest tak wtedy, kiedy wybiorę warstwę tekstową 1, zaznaczę warstwę tekstową 2 i wykonam skrypt, próbuje wypełnić wtedy zaznaczenie w warstwie tekstowej 1, ale ona tam nie sięga więc nic się nie wykonuje. Da się zrobić tak, żeby zawsze wykonywało wypełnienie zaznaczenia w warstwie najniższej?


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 15.02.2012, 18:31:34
Spróbuj teraz:

Kod:
(define (script-fu-make-border image drawable)
(gimp-image-undo-group-start image)
(gimp-selection-layer-alpha drawable)
(gimp-selection-border image 1)
(gimp-palette-set-default-colors)
(gimp-edit-fill (car (last (vector->list (cadr (gimp-image-get-layers image))))) FOREGROUND-FILL)
(gimp-image-remove-layer image drawable)
(gimp-displays-flush)
(gimp-image-undo-group-end image)
)

(script-fu-register "script-fu-make-border"
_"<Image>/Script-Fu/Make border"
"See http://www.gimpuj.info/index.php/topic,55029.html"
"Ziomioslaw"
"Ziomioslaw"
"2012-02-13"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
)


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 15.02.2012, 19:54:09
Idealnie :D Naprawdę, wielkie dzięki, bardzo mi to pomoże.
Pozdrawiam


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 16.02.2012, 17:09:48
Nie chcę przesadzić, ale jeśli to nie jest duży problem to potrzebuję jeszcze czegoś takiego:
Opcja 1:
Jest sobie jakaś tam warstwa tekstowa. No i tak:
1. Zduplikować warstwę dwukrotnie (postaną powiedzmy D1 i D2, ale to tylko na potrzeby zrozumienia instrukcji)
2. D1 i D2 wrzucić pod główną
3. Zaznaczyć kanał alfa w głównej
4. Powiększyć zaznaczenie o 1
5. W D1 wypełnić zaznaczenie na biało i zastosować Rozmycie Gaussa (poziomo i pionowo 5px, standardowe ustawienia)
6. Powiększyć to powiększone zaznaczenie jeszcze o 2
7. W D2 wypełnić zaznaczenie na czarno i Rozmycie Gaussa jak wyżej
8. Połączyć warstwy tak, aby wszystko było w jednej, ale w warstwie tła.
9. Odznaczyć wszystko.

Opcja 2:
Jak wyżej, tylko zamiana kolorów w punktach 5 na czarno i 7 na biało.

Byłbym bardzo wdzięczny, pozdrawiam.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 16.02.2012, 18:10:46
2. D1 i D2 wrzucić pod główną
3. Zaznaczyć kanał alfa w głównej

Co znaczy warstwa główna?


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 16.02.2012, 19:36:15
Miałem na myśli warstwę od której się wychodzi, czyli którą się duplikuje. Przepraszam za niedoprecyzowanie.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 20.02.2012, 22:09:03
Kod:
(define (script-fu-make-border image drawable)
(let *(
    ; 1. Zduplikować warstwę dwukrotnie
(layer-copy1 (car (gimp-layer-copy drawable TRUE)))
(layer-copy2 (car (gimp-layer-copy drawable TRUE)))
(main-layer-position (car (gimp-image-get-layer-position image drawable)))
  )

  (gimp-image-undo-group-start image)

; 2. D1 i D2 wrzucić pod główną
(gimp-image-add-layer image layer-copy1 (+ main-layer-position 1))
(gimp-image-add-layer image layer-copy2 (+ main-layer-position 2))

; 3. Zaznaczyć kanał alfa w głównej
(gimp-selection-layer-alpha drawable)

; 4. Powiększyć zaznaczenie o 1
(gimp-selection-border image 1)

; 5. W D1 wypełnić zaznaczenie na biało i zastosować Rozmycie Gaussa (poziomo i pionowo 5px, standardowe ustawienia)
(gimp-palette-set-default-colors)
(gimp-edit-fill layer-copy1 FOREGROUND-FILL)
(plug-in-gauss 1 image layer-copy1 5 5 1)

; 6. Powiększyć to powiększone zaznaczenie jeszcze o 2
(gimp-selection-border image 2)

; 7. W D2 wypełnić zaznaczenie na czarno i Rozmycie Gaussa jak wyżej
(gimp-edit-fill layer-copy2 BACKGROUND-FILL)
(plug-in-gauss 1 image layer-copy2 5 5 1)

; 8. Połączyć warstwy tak, aby wszystko było w jednej, ale w warstwie tła.
(gimp-image-lower-layer-to-bottom image layer-copy2)
(gimp-image-raise-layer image layer-copy2)
(gimp-image-merge-down image layer-copy2 1)

(gimp-image-lower-layer-to-bottom image layer-copy1)
(gimp-image-raise-layer image layer-copy1)
(gimp-image-merge-down image layer-copy1 1)

(gimp-image-lower-layer-to-bottom image drawable)
(gimp-image-raise-layer image drawable)
(gimp-image-merge-down image drawable 1)

; 9. Odznaczyć wszystko.
(gimp-selection-none image)

(gimp-displays-flush)
(gimp-image-undo-group-end image)
))

(script-fu-register "script-fu-make-border"
_"<Image>/Script-Fu/Make border"
"See http://www.gimpuj.info/index.php/topic,55029.html"
"Ziomioslaw"
"Ziomioslaw"
"2012-02-13"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
)

To jest opcja numer 1. Pewnie można ją napisać nieco bardziej optymalnie, ale już nie eksperymentowałem. No i w ten sposób jest zgodna z Twoją listą. Jeśli chodzi o opcję numer 2, myślę, że poradzisz sobie ze zmianą.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 02.03.2012, 23:53:54
No niestety gimp mi tego skryptu nie widzi. Chyba że coś źle robię, ale po rozwinięciu zakładki Script-Fu (zaraz po włączeniu Gimpa) mam tylko Make border z tamtego posta.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 03.03.2012, 11:40:31
No niestety gimp mi tego skryptu nie widzi. Chyba że coś źle robię, ale po rozwinięciu zakładki Script-Fu (zaraz po włączeniu Gimpa) mam tylko Make border z tamtego posta.

Bo tak się przedstawia. Może usuń wszystkie pliki z katalogu script i dodaj tylko ten jeden.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 03.03.2012, 17:30:41
Bo tak się przedstawia.

To wiele wyjaśnia. Skrypt z poprzedniego posta jak i ten skrypt zostały nazwane tak samo :) Już sobie poradziłem :)

Tylko jest jeden problem... Pomyliłem się, i zawaliłem sprawę...
Powinno wyglądać tak:

1. Zaznaczyć kanał alfa w warstwie wyjściowej, nazwijmy ją na potrzeby posta "abc".
2. Oderwać zaznaczenie, tworząc nową warstwę (tylko dla zrozumienia ;) )"xyz" .
3. Warstwę abc usunąć.
4. Utworzyć dwie nowe warstwy o rozmiarze równym rozmiarowi płótna.
5. Wrzucić nowe warstwy D1, D2 pod warstwę xyz tak, aby była kolejność xyz, d1, d2.
6. Zaznaczyć kanał alfa w xyz.

i dalej od punktu 4. z poprzedniego posta.

Naprawdę przepraszam, to bym chciał mieć gotowe i już nie będę męczył.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 10.03.2012, 20:37:43
Zaglądasz tu jeszcze Wiktorze?

Cytuj
1. Zaznaczyć kanał alfa w warstwie wyjściowej, nazwijmy ją na potrzeby posta "abc".
2. Oderwać zaznaczenie, tworząc nową warstwę (tylko dla zrozumienia Mrugnięcie )"xyz" .
3. Warstwę abc usunąć.

A to nie sprawdza się do stanu wyjściowego?


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Żaba on 10.03.2012, 21:30:09
Chyba nie, bo zostanie oderwana warstwa z kanałem alfa (xyz). Co prawda chyba będzie taka jak warstwa abc ale to może zależeć od obrazka, nie znam się...


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 10.03.2012, 22:48:08
Ale ona niczym się nie będzie różnić od warstwy wejściowej - wszak zaznaczenie pochodzi z kanału alfa.


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: wiktor93 on 03.04.2012, 18:38:40
Chodzi mi o to, że potem tą warstwą będę chciał manewrować za pomocą narzędzia Wyrównanie. Stara warstwa (abc) jako tekst byłaby nieprzycięta i to wyrównanie byłoby nierówne. Wklejając warstwę robi się tylko tyle, ile potrzeba co pozwala na precyzyjne wyrównywanie.
Jest to chyba równoznaczne z przycięciem warstwy abc, jednak ten sposób jakoś mam pewny ;)

No i niestety jest problem- mam od Ciebie skrypt, zmieniłem w nim nazwę tylko i nie wiem czemu nie działa. Wyskakuje błąd wykonywania. Error: eval: unbound variable

Kod:
(define (script-fu-make-border image drawable)
(let *(
    ; 1. Zduplikować warstwę dwukrotnie
(layer-copy1 (car (gimp-layer-copy drawable TRUE)))
(layer-copy2 (car (gimp-layer-copy drawable TRUE)))
(main-layer-position (car (gimp-image-get-layer-position image drawable)))
  )

  (gimp-image-undo-group-start image)

; 2. D1 i D2 wrzucić pod główną
(gimp-image-add-layer image layer-copy1 (+ main-layer-position 1))
(gimp-image-add-layer image layer-copy2 (+ main-layer-position 2))

; 3. Zaznaczyć kanał alfa w głównej
(gimp-selection-layer-alpha drawable)

; 4. Powiększyć zaznaczenie o 1
(gimp-selection-border image 1)

; 5. W D1 wypełnić zaznaczenie na biało i zastosować Rozmycie Gaussa (poziomo i pionowo 5px, standardowe ustawienia)
(gimp-palette-set-default-colors)
(gimp-edit-fill layer-copy1 FOREGROUND-FILL)
(plug-in-gauss 1 image layer-copy1 5 5 1)

; 6. Powiększyć to powiększone zaznaczenie jeszcze o 2
(gimp-selection-border image 2)

; 7. W D2 wypełnić zaznaczenie na czarno i Rozmycie Gaussa jak wyżej
(gimp-edit-fill layer-copy2 BACKGROUND-FILL)
(plug-in-gauss 1 image layer-copy2 5 5 1)

; 8. Połączyć warstwy tak, aby wszystko było w jednej, ale w warstwie tła.
(gimp-image-lower-layer-to-bottom image layer-copy2)
(gimp-image-raise-layer image layer-copy2)
(gimp-image-merge-down image layer-copy2 1)

(gimp-image-lower-layer-to-bottom image layer-copy1)
(gimp-image-raise-layer image layer-copy1)
(gimp-image-merge-down image layer-copy1 1)

(gimp-image-lower-layer-to-bottom image drawable)
(gimp-image-raise-layer image drawable)
(gimp-image-merge-down image drawable 1)

; 9. Odznaczyć wszystko.
(gimp-selection-none image)

(gimp-displays-flush)
(gimp-image-undo-group-end image)
))

(script-fu-register "script-fu-czarne-obramowanie"
_"<Image>/Script-Fu/Czarne obramowanie"
"See http://www.gimpuj.info/index.php/topic,55029.html"
"Ziomioslaw"
"Ziomioslaw"
"2012-02-13"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
)


Tytuł: Odp: Da się jakoś zautomatyzować pracę?
Wiadomość wysłana przez: Ziomioslaw on 03.04.2012, 19:22:13
Nie zmieniłeś sobie pierwszej linii, powinno być:

Kod:
(define (script-fu-czarne-obramowanie image drawable)