Programowanie w języku Python

Gimp

  • 2010-10-31 18:27
  • 2 komentarze
  • 1966 odsłon
  • Oceń ten tekst jako pierwszy
Artykuł  został umieszczony na liście Zalążków artykułów. Jeżeli możesz rozbuduj go!

Gimp umożliwia pisanie skryptów w języku python. Dzięki bibliotece funkcji, można dostać się praktycznie do każdej operacji jaka jest możliwa do wykonania w gimpie. Również do innych skryptów. Ponadto mamy pełen dostęp do biblioteki pythona. Wykorzystując pythona możemy wzbogacić gimpa o nowe efekty z możliwością konfigurowania ich parametrów w oknach dialogowych. Możemy również zautomatyzować sobie pracę automatycznie przycinając obraz i generując kod html lub innych. Możemy wreszcie wykorzystać gimpa do przetworzenia dużej ilości obrazów automatycznie, nawet nie uruchamiając jego okien.

Dokładna dokumentacja gimpfu znajduje się na stronie gimp-a. Jedyne czego potrzeba do uruchomienia pythona w gimpie jest posiadanie zainstalowanego pythona i gimpa skompilowanego z jego obsługą.

Przetwarzanie wsadowe


Załóżmy, że mamy kilkaset plików jpg i chcemy je wszystkie przeskalować, aby miały szerokość 800px i zachować proporcje. Możemy do tego wykorzystać gimp-a.

Aby mieć dostęp do funkcji gimp-a należy zaimportować moduł gimpfu:
from gimpfu import *


Dostęp do funkcji gimpa mamy przez bazę procedur: pdb. Uruchamiając gimp-a w menu Dodatki mamy Przeglądarkę procedur, za pomocą której możemy znaleźć opis i parametry procedur. Procedurę możemy wywołać w postaci pdb.nazwa_procedury(parametry) lub pdb['nazwa-procedury'](parametry)

Tworząc nasz skrypt również powinniśmy dopisać się do tej bazy. Robimy to wywołując funkcję register.

register(
  "kkk_scale", "", "", "Dryobates", "copyleft", "2006",
    "<Toolbox>/Xtns/Python-Fu/Moje/_KKK Scale", "",
  [
  (PF_STRING, "pattern", "File pattern", ""),
  (PF_INT, "new_width", "New width", ""),
  (PF_INT, "new_height", "New height", ""),
  ],
  [],
  kkk_scale
  )

Poszczególne parametry procedury to:
- nazwa - kkk_scale
- krótki opis
- szczegółowy opis
- autor - Dryobates
- copyright - copyleft
- data - 2006
- ścieżka do menu - ten skrypt będzie widoczny w głównym oknie gimpa <toolbox> w menu Dodatki/Python-Fu/Moje. Jeżeli chcemy by pojawiło się w oknie obrazu należy ścieżkę rozpocząć od <image>.
- typ obrazu - nie mam pojęcia co to jest, ale zawsze zostawiam puste i działa (TODO: znaleźć odpowiedź)
- parametry procedury - parametry to lista krotek (typ, nazwa, opis w bazie, wartość domyslna)
- wynik funkcji - w naszym przypadku nic nie zwraca. To również lista krotek, lecz postaci: (typ, nazwa, opis w bazie)
- ostatni parametr to funkcja którą rejestrujemy

Ustaliliśmy, że funkcja nazywać będzie się kkk_scale i będzie przyjmować 3 parametry. Pierwszy to łańcuch znaków, a dwa kolejne to liczby.

A oto cały kod:
#! /usr/bin/env python
from os import getcwd
from os.path import join
from glob import glob
from gimpfu import *
 
 
def kkk_scale(pattern, new_width, new_height):
    """ Przeskalowuje wszystkie pliki pasujace do wzorca"""
    # pobieramy wszystkie pliki pasujace do wzorca
    files = glob(join(getcwd(), pattern))
    # dla kazdego pliku
    for filename in files:
        # wczytujemy plik
        image = pdb.gimp_file_load(filename, filename);
        # pobieramy aktywna (i jedyna) warstwe, ktora bedziemy edytowac
        drawable = pdb.gimp_image_get_active_layer(image)
        # pobieramy rozmiary
        width = pdb.gimp_drawable_width(drawable)
        height = pdb.gimp_drawable_height(drawable)
        # bedziemy skalowac wzgledem wiekszego rozmiaru
        if width > height:
            n_width = new_width
            n_height = height*new_width/width
        else:
            n_height = new_height
            n_width = width*new_height/height
        # skalujemy
        pdb.gimp_drawable_transform_scale_default(drawable, 0, 0, n_width, n_height, 2, 0)
        # zapisujemy plik
        pdb.gimp_file_save(image, drawable, filename, filename)
        # usuwamy plik z pamieci
        pdb.gimp_image_delete(image)
 
register(
  "kkk_scale", "", "", "Dryobates", "copyleft", "2006",
    "<Toolbox>/Xtns/Python-Fu/Moje/_KKK Scale", "",
  [
  (PF_STRING, "pattern", "File pattern", ""),
  (PF_INT, "new_width", "New width", ""),
  (PF_INT, "new_height", "New height", ""),
  ],
  [],
  kkk_scale
  )
 
main()


Na koniec wywołujemy funkcję main z gimpfu. Ona wykonuje całe zadanie.

Aby uruchomić nasz skrypt należy go zapisać w katalogu gimp-a (w systemach uniksowych w katalogu domowym .gimpXYZ) w podkatalogu plug-ins.

Przykładowe wywołanie z linii poleceń:
gimp -i -b '(python-fu-kkk-scale RUN-NONINTERACTIVE "*jpg" 200 100)' '(gimp-quit 0)'

Do wykonania funkcji użylismy domyślnego interpretera script-fu. Stąd te polecenia w nawiasach.

'python-fu-kkk-scale' to nazwa naszej funkcji (podkreślenia zostały zamienione na myślniki i dodany został typ skryptu python-fu).

Kolejny parametr to RUN-NONINTERACTIVE. Do każdego skryptu możemy przekazać RUN-NONINTERACTIVE lub RUN-INTERACTIVE w zależności, czy chcemy by pojawił się interfejs graficzny gimp-a (oczywiście w naszym przypadku okienka są zbędne).

Następne to już parametry do naszego skryptu oddzielone spacjami.

Na koniec opuszczamy gimp-a.

Filtr z oknem z parametrami

2 komentarze

trollkong 2014-02-05 07:58

Świetny artykuł, na pewno się przyda.

Grymek 2010-08-17 22:22

fajny temat na artykuł :) Na polskich stronkach ciężko coś znaleść, a tu proszę. Dobra robota, Pozdrawiam