Использование директивы if в моем Script-Fu не позволяет ей работать - PullRequest
0 голосов
/ 07 мая 2020

Следующий скрипт предназначен для вызова через интерфейс GIMP CLI, и он меняет цветовые режимы всех PNG в текущем каталоге на индексированные:

(define (script-fu-batch-indexify pattern)
  (let* ((filelist (cadr (file-glob pattern 1))))
    (while (not (null? filelist))
      (let* ((filename (car filelist))
             (image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
             (drawable (car (gimp-image-get-active-layer image))))
        (gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE 256 0 0 "")
        (gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
        (gimp-image-delete image))
      (set! filelist (cdr filelist)))))

Этот скрипт работает хорошо, но требует, чтобы каждый PNG в текущем каталоге не индексируется. Он немедленно прервется, когда найдет проиндексированный PNG. Я намерен заставить его пропускать индексированные PNG. Я считаю, что лучше всего это сделать так:

(define (script-fu-batch-indexify pattern num-cols)
  (let* ((filelist (cadr (file-glob pattern 1))))
    (while (not (null? filelist))
      (let* ((filename (car filelist))
             (image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
             (drawable (car (gimp-image-get-active-layer image))))
        (unless (gimp-drawable-is-indexed image) ; Now it does not work anymore...
          (gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE num-cols 0 0 "")
          (gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
          (gimp-image-delete image)))
      (set! filelist (cdr filelist)))))

Но это мешает скрипту работать! Он выполняется без ошибок и без индексации неиндексированных PNG. Я пробовал использовать if с теми же результатами. Итак, что я здесь ошибаюсь?

(я использую Gimp 2.8.22 вместо Linux Mint 19.3.)

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Скрипт не закодирован так, как обычно пишется Scheme: мы очень стараемся избегать set! операций, то, что вы сделали, можно реализовать с помощью рекурсии вместо while l oop - в функциональном программировании стиль, это рекомендуемый способ. * Попробуйте распечатать приведенный выше результат непосредственно перед выражением unless, и посмотрим, что он показывает. Запустите GIMP из терминала и посмотрите на консоль:

(print (gimp-drawable-is-indexed image))
(unless (gimp-drawable-is-indexed image)
0 голосов
/ 10 мая 2020

Используйте print следующим образом:

(display (string-append "\n Indexed:" (number->string (car (gimp-drawable-is-indexed drawable))) "< \n"))
  1. Вы должны создать строку для (display ..)

    Сначала посмотрите в PDB для gimp-drawable-is- проиндексировано, возвращает int32 => [(number-> string], но все функции, возвращающие списки => [(car (..]

  2. (gimp-drawable-is-indexed .) требует слоя вместо изображения.

...