Теперь давайте добавим функциональность нашему сценарию.
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* ( ; декларация локальных переменных ; создать новое изображение: (theImageWidth 10) (theImageHeight 10) (theImage (car (gimp-image-new theImageWidth theImageHeight RGB ) ) ) (theText) ;переменная для текста, ;которой мы присвоим значение позже
Заметка: мы использовали значение 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.
Теперь, когда у нас есть новое изображение, нужно к нему добавить слой. Мы вызовем функцию gimp-layer-new
, чтобы создать новый слой, и дадим ей ID созданного изображения. (Отныне мы будем показывать только строки, которые мы добавляем или меняем, а не текст всей функции. Текст полного сценария находится здесь.) Поскольку мы задекларировали все локальные переменные, мы также закрываем скобку декларации переменных:
;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.
Удалите строку, показывающую пустое изображение (или деактивируйте её знаком комментария ;
в начале строки).
До добавление текста нужно установить цвет переднего плана и фона, чтобы текст появился в цветах, заданные пользователем. Мы будем вызывать функции 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!
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)
Это установит счётчик изменений на ноль, делая изображение «чистым».
Добавлять или не добавлять эту строку — зависит от личных предпочтений. Если результат простой и лекго воспроизводим, то можно добавить. Если сценарий сложен, требует много времени для работы, или работает с существующим изображением, то лучше не добавлять.