Lau*_*ves 29 image-manipulation gimp script-fu
作为构建过程的一部分,我需要将许多XCF(GIMP的本机格式)图像转换为PNG格式.我确信这应该可以使用GIMP的批处理模式,但我忘记了我曾经知道的所有脚本.
我的输入图像有多个图层,所以我需要等效于"合并可见图层"的批处理模式,然后是"另存为PNG".另请注意,我无法安装任何内容~/.gimp*/scripts/- 我需要一个自包含的命令行,或者在源代码树中安装脚本的方法.
请注意,虽然这与此问题类似,但我还有其他约束,我需要使用GIMP完成此操作.我尝试了当前版本的ImageMagick,它会破坏我的测试图像.
Lau*_*ves 25
在jsbueno发布他的回答之前,我也试过在#gimp IRC频道上询问.我被引导到Gimptalk上的这个线程,它包含以下代码:
gimp -n -i -b - <<EOF
(let* ( (file's (cadr (file-glob "*.xcf" 1))) (filename "") (image 0) (layer 0) )
(while (pair? file's)
(set! image (car (gimp-file-load RUN-NONINTERACTIVE (car file's) (car file's))))
(set! layer (car (gimp-image-merge-visible-layers image CLIP-TO-IMAGE)))
(set! filename (string-append (substring (car file's) 0 (- (string-length (car file's)) 4)) ".png"))
(gimp-file-save RUN-NONINTERACTIVE image layer filename filename)
(gimp-image-delete image)
(set! file's (cdr file's))
)
(gimp-quit 0)
)
EOF
Run Code Online (Sandbox Code Playgroud)
这个脚本用于xcf文件,然后为每个文件加载文件,合并可见图层,将结果保存为PNG,并"卸载"图像.最后,它退出了GIMP.glob方法用于避免为每个图像启动GIMP.它还侧重于将参数从shell获取到gimp的问题.
我发布这个答案,以防万一有人需要一种方法来做到这一点,而不使用GIMP-Python(也许是因为它没有安装).
jsb*_*eno 14
有几种方法可以解决这个问题 - 我首选的方法是开发GIMP-Python插件.Script-fu使用GIMP的内置方案实现,它在处理I/O方面非常差(例如列出目录中的文件) - 这个任务在Python中绝对是微不足道的.
所以,既然你说你不想保存新的脚本(你可以这样做,因为你可以在edit-> preferences->文件夹选项上添加新的插件和脚本目录,这样你就不需要写了〜 /.gimp*/plugins/)
无论如何,您可以在过滤器下打开python控制台,并将此片段粘贴到交互式提示中.
import gimpfu
def convert(filename):
img = pdb.gimp_file_load(filename, filename)
new_name = filename.rsplit(".",1)[0] + ".png"
layer = pdb.gimp_image_merge_visible_layers(img, gimpfu.CLIP_TO_IMAGE)
pdb.gimp_file_save(img, layer, new_name, new_name)
pdb.gimp_image_delete(img)
Run Code Online (Sandbox Code Playgroud)
这个小函数将打开任何图像,作为文件路径传递,展平它,并将其保存为具有默认设置的png,位于同一目录中.
按照该功能,您只需键入:
from glob import glob
for filename in glob("*.xcf"):
convert(filename)
Run Code Online (Sandbox Code Playgroud)
在交互式提示符上将当前目录中的所有.xcf文件转换为.png
(如果您没有安装gimp-python,它可能是您的Linux发行版上的一个单独的软件包,只需使用您喜欢的工具安装它 - 对于Windows下的那些,以及gimp-2.6,此页面上的说明必须是紧接着 - 它应该变得更容易在gimp 2.8)
如果您的图像按其文件名顺序编号,例如myimage_001.xcf,mymage_002.xcf等,则完全适用另一种方式.如果它们如此排列,您可以安装GIMP-GAP(gimp动画包),它允许在这样的图像序列中应用任何过滤器或动作.
Flo*_*low 11
这是我使用GIMP,GIMP的python-fu和bash的解决方案.请注意,GIMP的python-fu只能在gimp进程下运行,而不能在普通的python下运行.
#!/bin/bash
set -e
while getopts df: OPTION "$@"; do
case $OPTION in
d)
set -x
;;
f)
XCFFILE=${OPTARG}
;;
esac
done
if [[ -z "$XCFFILE" ]]; then
echo "usage: `basename $0` [-d] -f <xcfFile>"
exit 1
fi
# Start gimp with python-fu batch-interpreter
gimp -i --batch-interpreter=python-fu-eval -b - << EOF
import gimpfu
def convert(filename):
img = pdb.gimp_file_load(filename, filename)
new_name = filename.rsplit(".",1)[0] + ".png"
layer = pdb.gimp_image_merge_visible_layers(img, 1)
pdb.gimp_file_save(img, layer, new_name, new_name)
pdb.gimp_image_delete(img)
convert('${XCFFILE}')
pdb.gimp_quit(1)
EOF
Run Code Online (Sandbox Code Playgroud)
使用xcftools
在最初询问此问题时,此工具可能无法(或在任何情况下广为人知),但包中的xcf2png终端命令xcftools完全符合您的要求并且非常好.我将它用于我的论文脚本,并且是我对这个问题的首选.
从文档:
这是一组快速命令行工具,用于从Gimp的本机文件格式XCF中提取信息.
这些工具旨在允许有效地使用分层XCF文件作为构建系统中的源,这些源使用"make"和类似工具来管理图形的自动处理.
这些工具独立于Gimp引擎工作,甚至不需要安装Gimp.
"xcf2png"将XCF文件转换为PNG格式,必要时展平图层.透明度信息可以保留在图像中,也可以在命令行中指定背景颜色.
xcftools在评论中提到答案之后我发现了这个问题,但是我发布了这条评论很容易错过(我看到它是因为我专门检查了它)而且我认为xcftools值得一试正确答案的位置,因为它在这个时间点确实是最恰当的答案.)