LINUX.ORG.RU

GIMP - Scheme (Script-Fu) - Cохранение слоев в png

 , script-fu


1

3

Нижеприведенный скрипт перебирает все слои, берет их имена и сохраняет в картинки png. Пожалуйста, помогите мне подредактировать код, т. к. с Scheme Script-Fu знаком первый день, программирую на ООП языках. Нужно, чтобы, если в имени слоя был символ «-», то слой НЕ сохраняется в png картинку.

(define (script-fu-export-layers img drw path outnameformat)
; credit to Vijay Mathew on Stack Overflow for the expand keywords function
  (let ((expand-keywords (lambda(format tokens)
    (let loop ((slist (string->list format))
               (in-replace-mode #f)
               (result ""))
      (if (not (null? slist))
          (let ((c (car slist)))
            (cond (in-replace-mode
                   (let ((token (car (cdr (assoc c tokens)))))
                     (loop (cdr slist) #f (string-append result token))))
                  ((char=? c #\~)
                   (loop (cdr slist) #t result))
                  (else
                   (loop (cdr slist) #f (
                      string-append result (make-string 1 c))))))
          result)))))
ДЕЛАТЬ ПРОВЕРКУ НА СИМВОЛ, ВИДИМО НАДО ГДЕ-ТО В  НИЖЕПРИВЕДЕННОМ БЛОКЕ КОДА
  (for-each (lambda (layer)
    (let* (
        (name (expand-keywords outnameformat `(
          (#\~ "~")
          (#\i ,(car(gimp-image-get-name img)))
          (#\l ,(car(gimp-drawable-get-name layer))))))
        (outpath (string-append path "/" name)))
      (gimp-file-save RUN-NONINTERACTIVE img layer outpath name)
  )) (vector->list(cadr (gimp-image-get-layers img)))))
)

(script-fu-register
  "script-fu-export-layers"
  "Экспорт слоёв"
  "Экспортирует слои в отдельные изображения в формате PNG"
  "Stuart P. Bentley <stuart@testtrack4.com>"
  "(C) 2011 by Stuart P. Bentley"
  "June 28, 2011"
  "*"
  SF-IMAGE       "Image"         0
  SF-DRAWABLE    "Drawable"         0
  SF-DIRNAME     "Выбрать папку для сохранения"  ""
  SF-STRING      "Формат имени изображений\
  (~i = Имя изображения\
  ~l = Имя слоя\
  ~~ = ~)"
  "~l.png"
)



Последнее исправление: mikhailKazakov (всего исправлений: 4)

А что возвращает (gimp-image-get-layers img) ?

В зависимости от ответ, тебе нужно заменить

(vector->list (cadr (gimp-image-get-layers img)))

На что-то типа

(vector->list (filter 
		(lambda (str) (not (string-contains str "-"))) 
		(cadr (gimp-image-get-layers img))))
ugoday ★★★★★
()
Ответ на: комментарий от ugoday

А что возвращает (gimp-image-get-layers img) ? - из справки Гимп: Returns the list of layers contained in the specified image.

Parameters: image IMAGE

Return Values: num-layers INT32 image-ids INT32ARRAY - list of layers contained in the image. Спасибо за код, попробовал, но при перезагрузке гимпа, скрипт не появляется в меню Файл, т.е. значит где-то в нем есть ошибка. В чем может быть ошибка?

mikhailKazakov
() автор топика
Ответ на: комментарий от mikhailKazakov

Смотри, что тут происходит.

lisp

(cadr (gimp-image-get-layers img))

возвращает список

image-ids INT32ARRAY - list of layers contained in the image

И пытается отфильтровать список, как если бы это был список строк. А это не список строк. При попытке (string-contain INT32 "-") естественно возникает ошибка.

Соответственно нужно как-то из id получить имя слоя и фильтровать по нему.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Так, все-таки скрипт появляется, но при выполнении выдает ошибку: Error:(:1)car: argument 1 must be: pair

Хм, да, надо как то в строки переводить.

mikhailKazakov
() автор топика
Ответ на: комментарий от ugoday

Соответственно нужно как-то из id получить имя слоя и фильтровать по нему. Посмотрел справку - вот, функции работы со слоями и именами: http://pixs.ru/showimage/Image005pn_2062204_26017577.png

Там ф-я получения имени слоя в стринг по Item

mikhailKazakov
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.