3.5. Προσθήκη πρόσθετης λειτουργικότητας

Ας συνεχίσουμε την εκπαίδευση μας και ας προσθέσουμε κάποια λειτουργικότητα στο σενάριό μας.

3.5.1. Δημιουργία νέας εικόνας

In the previous lesson, we created an empty function and registered it with GIMP. In this lesson, we want to provide functionality to our script — we want to create a new image, add the user's text to it and resize the image to fit the text exactly.

Once you know how to set variables, define functions and access list members, the rest is all downhill — all you need to do is familiarize yourself with the functions available in GIMP's procedural database and call those functions directly. Open the Τμήμα 12.9, «Ο περιηγητής διαδικασίας».

Ας ξεκινήσουμε κάνοντας μια νέα εικόνα. Θα δημιουργήσουμε μια νέα μεταβλητή, theImage, ρυθμισμένη να καλεί το αποτέλεσμα της ενσωματωμένης συνάρτησης του GIMP gimp-image-new.

As you can see from the DB Browser, the function gimp-image-new takes three parameters — the image's width, height and the type of image. Because we'll later resize the image to fit the text, we'll make a 10×10 pixels RGB image. We'll store the image's width and sizes in some variables, too, as we'll refer to and manipulate them later in the script.

        (define (script-fu-text-box inText inFont inFontSize inTextColor)
        (let*
              (
                 ; define our local variables
                 ; create a new image:
                 (theImageWidth  10)
                 (theImageHeight 10)
                 (theImage (car
                                (gimp-image-new
                                 theImageWidth
                                 theImageHeight
                                 RGB
                                )
                           )
                 )
                 (theText)     ;a declaration for the text
                               ;we create later
      

Παρατήρηση: Χρησιμοποιήσαμε την τιμή RGB για να καθορίσουμε ότι η εικόνα είναι μια RGB εικόνα. Θα μπορούσαμε επίσης να χρησιμοποιήσουμε 0, αλλά το RGB είναι πιο περιγραφικό, όταν κοιτάμε τον κώδικα.

You should also notice that we took the head of the result of the function call. This may seem strange, because the database explicitly tells us that it returns only one value — the ID of the newly created image. However, all GIMP functions return a list, even if there is only one element in the list, so we need to get the head of the list.

3.5.2. Προσθήκη μιας νέας στρώσης στην εικόνα

Τώρα που έχουμε μια εικόνα, χρειάζεται να προσθέσουμε μια στρώση σ' αυτή. Θα ονομάσουμε τη συνάρτηση gimp-layer-new για να δημιουργήσουμε τη στρώση, μεταφέροντας στην ταυτότητα της εικόνας που μόλις δημιουργήσαμε. (Από δω και πέρα, αντί να καταγράφουμε την πλήρη συνάρτηση, θα καταγράφουμε μόνο τις γραμμές που της προσθέτουμε. Μπορείτε να δείτε το πλήρες σενάριο here.) Επειδή δηλώσαμε όλες τις τοπικές μεταβλητές που θα χρησιμοποιήσουμε, θα κλείσουμε επίσης τις παρενθέσεις σημειώνοντας το τέλος των δηλώσεων των μεταβλητών μας:

        ;create a new layer for the image:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           "layer 1"
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           100
                           LAYER-MODE-NORMAL
                          )
                      )
            )
         ) ;end of our local variables
      

Αφού έχουμε τη νέα στρώση, χρειαζόμαστε να την προσθέσουμε στην εικόνα:

        (gimp-image-insert-layer theImage theLayer 0 0)
      

Τώρα, μόνο για πλάκα, ας δούμε τους καρπούς της εργασίας μέχρι αυτό το σημείο και ας προσθέσουμε αυτή τη γραμμή για να εμφανιστεί η νέα, κενή εικόνα:

(gimp-display-new theImage)

Save your work, restart GIMP, run the script and a new image should pop up. It will probably contain garbage (random colors), because we haven't erased it. We'll get to that in a second.

3.5.3. Προσθήκη κειμένου

Συνεχίστε και αφαιρέστε την γραμμή εμφάνισης της εικόνας (ή σχολιάστε την με ένα (;) ως τον πρώτο χαρακτήρα της γραμμής).

Πριν να προσθέσουμε κείμενο στην εικόνα, χρειαζόμαστε να ορίσουμε τα χρώματα παρασκηνίου και προσκηνίου, έτσι ώστε το κείμενο να εμφανίζεται στο χρώμα που όρισε ο χρήστης. Θα χρησιμοποιήσουμε τις συναρτήσεις gimp-context-set-back/foreground:

        (gimp-context-set-background '(255 255 255) )
        (gimp-context-set-foreground inTextColor)
      

Με τα χρώματα κατάλληλα ορισμένα, ας καθαρίσουμε τώρα τα τρέχοντα σκουπίδια στην εικόνα συμπληρώνοντας την περιοχή σχεδίασης με το χρώμα παρασκηνίου:

        (gimp-drawable-fill theLayer FILL-BACKGROUND)
      

Με την εικόνα καθαρισμένη, είμαστε έτοιμοι να προσθέσουμε κάποιο κείμενο:

        (set! theText
                      (car
                           (gimp-text-font
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize
                            inFont)
                       )
        )
      

Αν και μεγάλη η κλήση της συνάρτησης, είναι ολότελα απλή εάν κοιτάξετε προσεκτικά τις παραμέτρους, ενώ κοιτάτε στις εισόδους της συνάρτησης στον περιηγητή ΒΔ. Βασικά, δημιουργούμε μια νέα στρώση κειμένου και την αποδίδουμε στη μεταβλητή theText.

Τώρα που έχουμε το κείμενο, μπορούμε να ορίσουμε το πλάτος, το ύψος και να αλλάξουμε το μέγεθος της εικόνας και της στρώσης της εικόνας στο μέγεθος του κειμένου:

        (set! theImageWidth   (car (gimp-drawable-get-width  theText) ) )
        (set! theImageHeight  (car (gimp-drawable-get-height theText) ) )

        (gimp-image-resize theImage theImageWidth theImageHeight 0 0)

        (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
      

Εάν είσθε όπως εγώ, θα αναρωτιέστε προφανώς τη διαφορά μεταξύ μιας περιοχής σχεδίασης και μιας στρώσης. Η διαφορά έγκειται στο ότι η περιοχή σχεδίασης είναι οτιδήποτε που κάποιος μπορεί να σχεδιάσει, συμπεριλαμβάνοντας στρώσεις αλλά και κανάλια, μάσκες στρώσης, επιλογές κλ· η στρώση είναι μια πιο εξειδικευμένη έκδοση της περιοχής σχεδίασης. Στις περισσότερες περιπτώσεις, η διαφορά δεν είναι σημαντική.

Με την εικόνα έτοιμη, μπορούμε τώρα να ξαναπροσθέσουμε την γραμμή εμφάνισης της εικόνας:

        (gimp-display-new theImage)
      

Save your work, restart GIMP and give your first script a run!

3.5.4. Καθαρισμός της ακάθαρτης σημαίας

If you try to close the image created without first saving the file, GIMP will ask you if you want to save your work before you close the image. It asks this because the image is marked as dirty, or unsaved. In the case of our script, this is a nuisance for the times when we simply give it a test run and don't add or change anything in the resulting image — that is, our work is easily reproducible in such a simple script, so it makes sense to get rid of this dirty flag.

Για να το κάνουμε αυτό, μπορούμε να καθαρίσουμε την ακάθαρτη σημαία μετά την εμφάνιση της εικόνας:

        (gimp-image-clean-all theImage)
      

Αυτό θα ορίσει το μετρητή ακαθαρσίας στο 0, κάνοντας την να φαίνεται ως «καθαρή» εικόνα.

Η προσθήκη ή όχι αυτής της γραμμής είναι θέμα προσωπικής επιλογής. Τη χρησιμοποιώ σε σενάρια που παράγουν νέες εικόνες, όπου τα αποτελέσματα είναι ασήμαντα, όπως σε αυτή την περίπτωση. Εάν το σενάριο σας είναι πολύ περίπλοκο, ή εάν τρέχει σε υπάρχουσα εικόνα, δε θα θέλετε προφανώς να χρησιμοποιήσετε αυτήν τη συνάρτηση.