Continuemos con nuestro entrenamiento y añadamos alguna funcionalidad a nuestro script
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. So fire up the Sección 12.7, “Examinador de procedimientos” and let's get cookin'!
Let's begin by making a new image. We'll create a new variable,
theImage
, set to the result of calling
GIMP's
built-in function 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 10x10 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
Note: We used the value RGB
to specify that the image
is an RGB image. We could have also used
0
, but RGB is more descriptive
when we glance at the code.
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.
Now that we have an image, we need to add a layer to it. We'll
call the gimp-layer-new
function to create the
layer, passing
in the ID of the image we just created. (From now on, instead
of listing the complete function, we'll only list the lines
we're adding to it. You can see the complete script
here.)
Because we've declared all of the local variables we'll use,
we'll also close the parentheses marking the end of our
variable declarations:
;create a new layer for the image: (theLayer (car (gimp-layer-new theImage theImageWidth theImageHeight RGB-IMAGE "layer 1" 100 NORMAL ) ) ) ) ;end of our local variables
Una vez tenemos la capa nueva, necesitaremos añadirla a la imagen:
(gimp-image-add-layer theImage theLayer 0)
Ahora, por diversión, veremos los frutos de nuestra labor hasta este punto, y añadiremos esta linea para mostrar la imagen nueva y vacia:
(gimp-display-new theImage)
Save your work, select
→ → , 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.
Go ahead and remove the line to display the image (or comment
it out with a (;
) as the first character of the line).
Antes de que añadamos texto a la imagen, necesitamos seleccionar los colores de fondo y frente, para que así aparezca con el color especificado por el usuario. Usaremos las funciones gimp-context-set-background
y gimp-context-set-foreground
:
(gimp-context-set-background '(255 255 255) ) (gimp-context-set-foreground inTextColor)
Con los colores seleccionados correctamente, ahora, limpiaremos la basura actual en la imagen para rellenar el dibujable con el color de fondo:
(gimp-drawable-fill theLayer BACKGROUND-FILL)
Con la imagen limpia, estamos listos para añadir algún texto:
(set! theText (car (gimp-text-fontname theImage theLayer 0 0 inText 0 TRUE inFontSize PIXELS "Sans") ) )
Aunque hay una llamada de función, es bastante más sencillo si repasas los parámetros mientras miras las entradas de función en el examinador de procedimientos. Basicamente, estamos creando una nueva capa de texto y la asignamos a la variable theText
.
Ahora que tenemos el texto, podemos coger el ancho y alto y redimensionar la imagen y la capa de la imagen al tamaño del texto:
(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)
Si es como yo, le maravillará lo que es un dibujable comparado con una capa. La diferencia entre los dos es que un dibujable es algo en lo que puedes dibujar, incluido capas, pero también canales, máscaras de capa, selecciones, etc.; una capa es una versión más especifica de un dibujable. En muchos casos, la distinción no es importante.
Con la imagen lista, podemos reañadir nuestra linea de representación:
(gimp-display-new theImage)
Guarde su trabajo, refresque la base de datos y ejecute su primer script!.
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.
Para hacer esto, puede limpiar la marca sucia y despues mostrar la imagen:
(gimp-image-clean-all theImage)
This will set dirty count to 0, making it appear to be a “clean” image.
Añadir esta linea o no es cuestión del gusto personal. Uselo en scripts que produzcan nuevas imágenes, donde los resultados son triviales, como en este caso. Si su script es muy complicado, o si trabaja sobre una imagen existente, probablemente no querrá usar esta función..