【发布时间】:2021-09-29 20:03:45
【问题描述】:
目标
我有一堆使用透明度的 .tga 图片。这些图像用于有时以透明度呈现有时不以透明度呈现的应用程序,因此“背景”(对应于包含 Alpha 通道的图层蒙版中黑色部分的 RGB 区域)至关重要。
为了更改单个图像的背景,我的手动过程(甚至可能不是最有效的)是:添加图层蒙版 > 传输图层的 Alpha 通道 > 复制图层蒙版的内容 > 应用图层蒙版 > 粘贴新背景层到图像中(相同尺寸)>将新层移动到堆栈底部>展平图像>添加图层蒙版(到生成的单层)>传输图层的Alpha通道>从剪贴板粘贴上一层蒙版的内容>应用图层蒙版>导出到.tga。
我正在尝试编写一个以参数为参数的脚本:目标文件扩展名、包含目标文件的目录、新背景图像以及创建目标文件备份的选项。批处理脚本应将上述过程应用于具有目标文件扩展名的目录中的每个图像。
方法
按照 GIMP 的脚本教程及其批处理模式页面的示例,我编写了以下脚本-fu(方案)。对于背景和目标图像的尺寸或文件类型不同的情况,我没有进行任何类型的异常处理。就我而言,所有目标文件都是 .tga,所有背景都是 .tga/.png/.jpg。
(script-fu-register
"batch-background-replacement"
"Batch Background Replacement"
"Replace backgrounds of all images in a directory"
"Callistonian"
"2021, Callistonian"
"September 28, 2021"
""
SF-STRING "File type" "tga"
SF-DIRNAME "Directory" ""
SF-FILENAME "New background" (string-append "" gimp-data-directory "")
SF-TOGGLE "Create backups?" 0
)
(script-fu-menu-register "batch-background-replacement" "<Image>/File")
(define (batch-background-replacement fileType directory background backups)
(let*
(
(filelist (cadr (file-glob (string-append directory "*." fileType) 1)))
)
(while (not (null? filelist))
(let*
(
(filename (car filelist))
(image (car (gimp-file-load 1 filename filename)))
(layer (car (gimp-image-get-active-layer image)))
)
(gimp-image-undo-disable image)
(if (equal? backups 1)
(gimp-file-save 1 image layer (string-append filename "_backup") (string-append filename "_backup"))
)
(gimp-layer-add-mask layer (car (gimp-layer-create-mask layer 3)))
(gimp-edit-copy (car (gimp-image-get-active-drawable image)))
(gimp-layer-set-apply-mask (car (gimp-image-get-active-layer image)) TRUE)
(gimp-image-insert-layer image (car (gimp-file-load-layer 1 image (car (gimp-file-load 1 background background)))) 0 1)
(gimp-image-flatten image)
(gimp-layer-add-mask (car (gimp-image-get-active-layer image)) (car (gimp-layer-create-mask layer 3)))
(gimp-edit-paste (car (gimp-image-get-active-drawable image)) TRUE)
(gimp-layer-set-apply-mask (car (gimp-image-get-active-layer image)) TRUE)
(gimp-image-undo-enable image)
(gimp-file-save 1 image layer filename filename)
(gimp-image-delete image)
)
(set! filelist (cdr filelist))
)
)
)
问题
在解决了一些语法错误后,脚本现在运行但静默失败 - 目标图像没有任何反应,也没有证据表明 GIMP 做了任何事情。
评论
我怀疑目标图像和新背景的路径存在问题,脚本根本找不到它们中的任何一个。但是我还没有找到一种方法可以在任何地方打印任何东西,这使得调试变得不可能。
这是我第一次尝试编写 GIMP 脚本或使用方案。我知道 GIMP 的批处理模式页面实际上建议使用命令行进行批处理,但我更喜欢在一个漂亮的对话框中给出所有输入,就像这个脚本提供的那样。
【问题讨论】:
标签: scheme batch-processing gimp script-fu