如何使用命令行中的GIMP将XCF转换为PNG?

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(也许是因为它没有安装).

  • 这似乎是与 GNU 图像处理程序 2.10 版一起使用的少数选项之一。请注意,如果您有较大的 xcf 图像,您可能会收到 TinyScheme `ts&gt;` 提示,直到转换过程完成为止。Xcftools(其他地方提到的“xcf2png”)不支持 XCF 版本 12,而 ImageMagick(自版本 7.0.8.15 起)仅支持 XCF 版本 11 (2认同)

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动画包),它允许在这样的图像序列中应用任何过滤器或动作.

  • 有趣!我不知道Python-Fu.这肯定比Script-Fu的lobotomized Scheme实现(以及非lispy API)好很多.我希望这完全是非交互式的,那么从命令行调用Python-Fu的最佳方法是什么?`gimp-console --batch-interpreter python-fu-eval -b - <myscript`似乎有效 - 是否有更好/更简洁的方法? (2认同)

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)

  • 看起来不错,但是如果我理解正确,就可以为每个文件启动和关闭gimp。可以避免吗? (2认同)

Tas*_*nou 7

使用xcftools

在最初询问此问题时,此工具可能无法(或在任何情况下广为人知),但包中的xcf2png终端命令xcftools完全符合您的要求并且非常好.我将它用于我的论文脚本,并且是我对这个问题的首选.

从文档:

这是一组快速命令行工具,用于从Gimp的本机文件格式XCF中提取信息.
这些工具旨在允许有效地使用分层XCF文件作为构建系统中的源,这些源使用"make"和类似工具来管理图形的自动处理.
这些工具独立于Gimp引擎工作,甚至不需要安装Gimp.

"xcf2png"将XCF文件转换为PNG格式,必要时展平图层.透明度信息可以保留在图像中,也可以在命令行中指定背景颜色.


(PS.我发现xcftools在评论中提到答案之后我发现了这个问题,但是我发布了这条评论很容易错过(我看到它是因为我专门检查了它)而且我认为xcftools值得一试正确答案的位置,因为它在这个时间点确实是最恰当的答案.)

  • 不幸的是,我收到“警告:不支持 XCF 版本 8(无论如何都在尝试...)”。似乎上次更新是在 2009 年,甚至 [fork](https://github.com/j-jorge/xcftools) 也很旧,无法使用。 (4认同)