3.5. Δίνοντας στο σενάριό μας περισσότερη ψυχή

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

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

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

Αφού ξέρετε πώς να ορίσετε μεταβλητές, συναρτήσεις και να προσπελάσετε μέλη λίστας, τα υπόλοιπα είναι όλα εύκολα — αυτό που χρειάζεστε είναι η εξοικείωση με τις διαθέσιμες συναρτήσεις του GIMP στη διαδικασιακή βάση δεδομένων και την άμεση κλήση αυτών των συναρτήσεων. Λοιπόν, ξεκινάμε την Τμήμα 12.8, «Ο περιηγητής διαδικασίας» και φύγαμε!

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

Όπως μπορείτε να δείτε από τον περιηγητή διαδικασίας, η συνάρτηση gimp-image-new παίρνει τρεις παραμέτρους — το πλάτος της εικόνας, το ύψος και τον τύπο της εικόνας. Επειδή αργότερα θα αλλάξουμε το μέγεθος της εικόνας για να ταιριάξει στο κείμενο, θα κάνουμε μια εικόνα RGB 10x10 εικονοστοιχεία. Θα αποθηκεύσουμε το πλάτος και τα μεγέθη της εικόνας σε κάποιες μεταβλητές, καθώς θα αναφερθούμε σε αυτές και θα τις επεξεργαστούμε αργότερα στο σενάριο.

        (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 είναι πιο περιγραφικό, όταν κοιτάμε τον κώδικα.

Θα πρέπει επίσης να σημειώσετε ότι πήραμε την κεφαλή του αποτελέσματος της κλήσης της συνάρτησης. Αυτό μπορεί να φανεί περίεργο, επειδή η βάση δεδομένων ρητά μας λέει ότι επιστρέφει μόνο μια τιμή — την ταυτότητα της νεοδημιουργημένης εικόνας. Όμως, όλες οι συναρτήσεις του GIMP επιστρέφουν μια λίστα, ακόμα κι αν υπάρχει μόνο ένα στοιχείο στη λίστα, έτσι χρειαζόμαστε να πάρουμε την κεφαλή της λίστας.

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

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

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

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

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

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

(gimp-display-new theImage)

Αποθηκεύστε την εργασία σας, επιλέξτε ΦίλτραScript-FuΑνανέωση σεναρίων, τρέξτε το σενάριο και μια νέα εικόνα θα εμφανιστεί. Θα περιέχει πιθανόν σκουπίδια (τυχαία χρώματα), επειδή δεν τα έχουμε σβήσει. Θα επανέλθουμε σε αυτό αργότερα.

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

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

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

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

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

        (gimp-drawable-fill theLayer BACKGROUND-FILL)
      

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

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

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

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

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

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

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

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

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

        (gimp-display-new theImage)
      

Αποθηκεύστε την εργασία σας, ανανεώστε τη βάση δεδομένων και τρέξτε το πρώτο σας σενάριο!

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

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

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

        (gimp-image-clean-all theImage)
      

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

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