Script-Fu

De flesta vet att programmet gimp är ett utmärkt alternativ till Photoshop. Något som är mindre känt är att gimp också är ett kraftfullt scriptverktyg.

Låt säga att vi vill skriva ett script för att titta vilken färg som finns på plats (0,0) och göra allt i bilden med samma färg genomskinligt. Gör operationen via menyerna först och anteckna vilka menyalternativ som används. I exemplet används bilden ”skull.png” som har färgen grönt, (0 255 0), på plats (0,0).

  1. Öppna filen ”skull.png”.
  2. Välj Select->By Color, använd pixeln på koordinat (0,0).
  3. Select->Invert
  4. Layer->Transparency->Add Alpha Channel
  5. Layer->Mask->Add Layer Mask. Välj ”Selection” i dialogen.
  6. Layer->Mask->Apply Layer Mask
  7. File->Save As. Skriv in filnamn ”skull_trans.png”.
  8. Stäng bilden.

För att göra ett script av ovanstående, öppna dialogen: Xtns->Script-Fu->Script-Fu Console. Språket som Script-Fu använder är en variant av lisp som kallas Scheme. För att titta på vilka funktioner som finns, välj browse. De flesta funktioner motsvarar ett menyalternativ. För att utföra vissa menyalternativ krävs mer än ett funktionsanrop. Följande funktioner motsvarar ovanstående lista.

Script-Fu konsolen in action

  • Steg 1. (gimp-file-load RUN-NONINTERACTIVE ”skull.png” ”skull.png”) Detta returnerar (1) som blir bildens id.
  • Steg 1. (gimp-display-new 1) Detta visar den laddade bilden. I scriptet kan detta steg hoppas över men det är användbart just nu för att se vad som händer.
  • Steg 1. (gimp-image-get-active-layer 1) Detta returnerar (2) vilket blir lagrets id.
  • Steg 2. (gimp-image-pick-color 1 2 0 0 0 0 0) Tittar vilken färg som finns på (0,0). 1 är bildens id och 2 är lagrets id. Detta returnerar RGB-listan ((0 255 0)).
  • Steg 2. (gimp-by-color-select 2 ‘(0 255 0) 0 0 0 0 0 0) Välj allt som har färg (0 255 0). Se dokumentationen för resten av argumenten.
  • Steg 3. (gimp-selection-invert 1) Ettan är bildens id.
  • Steg 4. (gimp-layer-add-alpha 2) Tvåan är lagrets id.
  • Steg 5. (gimp-layer-add-mask 2 (car (gimp-layer-create-mask 2 4))) Tvåorna är lagrets id. Fyran betyder GIMP_ADD_SELECTION_MASK och motsvarar radioknappen ”selection” i menyn. Som synes görs två kommandon på samma rad här. Resultatet av gimp-layer-create-mask skickas in som argument till gimp-layer-add-mask. Funktionen car plockar ut första elementet ur en lista. Detta behövs eftersom gimp-layer-create-mask returnerar en lista innehållande ett id för masken, men vi vill ha själva id:t, inte listan, därför behövs car.
  • Steg 6. (gimp-layer-remove-mask 2 0) Igen så är tvåan lagrets id. Detta motsvarar alltså ”Apply Mask” i menyalternativet.
  • Steg 7. (gimp-file-save RUN-NONINTERACTIVE 1 2 ”skull_trans.png” ”skull_trans.png”) Spara bilden.
  • Steg 8. (gimp-image-delete 1) Använd gimp-display-delete istället ifall gimp-display-new användes i steg 1. I scriptet används gimp-image-delete.

I slutet av scriptet vill vi avsluta gimp. Detta görs med (gimp-quit 0).

För att göra allt detta automatiskt från kommandoraden, utan att starta gimps grafiska gränssnitt, kan gimp startas med argumenten -i -b ‘script’. Ett shellscript som tar namnet på infilen och utfilen som argument och sedan kör Script-Fu scriptet på infilen och skriver resultatet till utfilen följer nedan.


#!/bin/sh
# Kolla inargument
if ! test -f "$1" || test $# != "2"; then
echo "Usage: $0 <infile> <outfile>"
exit 1
fi
echo -n "Konverterar $1 -> $2: "
gimp -i --batch-interpreter plug_in_script_fu_eval -b "(let* ((image (car (gimp-file-load RUN-NONINTERACTIVE \"$1\" \"$1\"))) (drawable (car (gimp-image-get-active-layer image))) (color (car (gimp-image-pick-color image drawable 0 0 0 0 0))) ) (gimp-by-color-select drawable color 0 0 0 0 0 0) (gimp-selection-invert image) (gimp-layer-add-alpha drawable) (gimp-layer-add-mask drawable (car (gimp-layer-create-mask drawable 4))) (gimp-layer-remove-mask drawable 0) (gimp-file-save RUN-NONINTERACTIVE image drawable \"$2\" \"$2\") (gimp-image-delete image))" '(gimp-quit 0)'

Om shellscriptet sparas i filen trans.sh så kan skull.png göras genomskinlig med kommandot:


$ sh trans.sh skull.png skull_trans.png

Inte nog med det. Det går att använda alla filformat som stöds av gimp. För att till exempel konvertera alla bitmapfiler i en katalog till png och samtidigt göra dem genomskinliga, kör:


$ for i in *.bmp; do sh trans.sh $i `basename $i .bmp`.png; done

I utvecklingsversionen av gimp, från och med version 2.3.13, har Script-Fu ersatts av Tiny-Fu. Den är kompatibel med Script-Fu och det enda som behöver ändras i framtida versioner är argumentet till –batch-interpreter. Jag antar att det kommer att fungera med --batch-interpreter plug_in_tiny_fu_eval.

Advertisements

Om albertveli

Grävande programmerare.
Det här inlägget postades i Programmering. Bokmärk permalänken.

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s