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

时间:2011-04-26 18:16:00

标签: image-manipulation gimp script-fu

作为构建过程的一部分,我需要将许多XCF(GIMP的原生格式)图像转换为PNG格式。我确信这应该可以使用GIMP的批处理模式,但我忘记了我以前所知的所有剧本。

我的输入图像有多个图层,所以我需要相当于“合并可见图层”的批处理模式,然后是“另存为PNG”。另请注意,我无法在~/.gimp*/scripts/中安装任何内容 - 我需要一个自包含的命令行,或者在源代码树中安装脚本的方法。

请注意,虽然这与this question类似,但我还有额外的约束,我需要使用GIMP完成此操作。我尝试了当前版本的ImageMagick,它会破坏我的测试图像。

5 个答案:

答案 0 :(得分:24)

在jsbueno发布他的回答之前,我也试过在#gimp IRC频道上询问。我被定向到this thread on 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

这个脚本用于xcf文件,然后为每个文件加载文件,合并可见图层,将结果保存为PNG,并“卸载”图像。最后,它退出了GIMP。 glob方法用于避免为每个图像启动GIMP。它还侧面解决了从shell获取参数到gimp的问题。

我发布这个答案是为了防止有人在不使用GIMP-Python的情况下需要这样做(可能是因为没有安装)。

答案 1 :(得分:14)

有几种方法可以解决这个问题 - 我首选的方法是开发GIMP-Python插件。 Script-fu使用GIMP的内置方案实现,它在处理I / O方面非常差(例如列出目录中的文件) - 这项任务在Python中绝对是微不足道的。

所以,既然你说你不想保存新的脚本(你可以这样做,因为你可以在edit-&gt; preferences-&gt;文件夹选项上添加新的插件和脚本目录,这样你就不会需要写上〜/ .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)

这个小函数将打开任何图像,作为文件路径传递,展平它,并将其保存为具有默认设置的png,位于同一目录中。

按照该功能,您只需输入:

即可
from glob import glob
for filename in glob("*.xcf"):
    convert(filename)

在交互式提示符上将当前目录中的所有.xcf文件转换为.png

(如果您没有安装gimp-python,它可能是您的Linux发行版上的一个单独的软件包,只需使用您喜欢的工具安装它 - 对于windows下的那些,以及gimp-2.6,{{3上的说明必须遵循 - 它应该变得更容易在gimp 2.8)

如果您的图像按其文件名顺序编号,例如myimage_001.xcf,mymage_002.xcf等,则完全适用另一种方式。如果它们如此安排,你可以安装GIMP-GAP(gimp动画包),它允许人们在这样的图像序列中应用任何过滤器或动作。

答案 2 :(得分: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

答案 3 :(得分:5)

使用xcftools

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

来自文档:

  

这是一组用于提取信息的快速命令行工具    来自Gimp的原生文件格式XCF    这些工具旨在允许有效地使用分层XCF文件    使用“make”和类似工具进行管理的构建系统中的源代码    自动处理图形。
   这些工具独立于Gimp引擎而不需要    甚至可以安装Gimp。

  

“xcf2png”将XCF文件转换为PNG格式,展平图层if    必要。    透明度信息可以保存在图像或背景中    可以在命令行上指定颜色。

<小时/> (PS。我发现评论中提到的alias Project.{Model1,Model2,Model3} 就在我决定发布有关它的答案之后,但我仍然在发帖,因为这个评论很容易错过(我看到它因为我专门检查了它认为xcftools值得一个正确答案的插槽,因为它在这个时间点确实是最恰当的答案。)

答案 4 :(得分:1)

我知道这不是严格正确的答案,但我在搜索的过程中看到了这里。

我在这里修改了示例代码以创建可行的插件

http://registry.gimp.org/node/28124

本页的其他答案中有一些代码

#!/usr/bin/env python

from gimpfu import *
import os



def batch_convert_xcf_to_png(img, layer, inputFolder, outputFolder):
    ''' Convert the xcf images in a directory to png.

    Parameters:
    img : image The current image (unused).
    layer : layer The layer of the image that is selected (unused).
    inputFolder : string The folder of the images that must be modified.
    outputFolder : string The folder in which save the modified images.
    '''
    # Iterate the folder
    for file in os.listdir(inputFolder):
        try:
            # Build the full file paths.
            inputPath = inputFolder + "\\" + file

            new_name = file.rsplit(".",1)[0] + ".png"
            outputPath = outputFolder + "\\" + new_name

            # Open the file if is a XCF image.
            image = None
            if(file.lower().endswith(('.xcf'))):
                image = pdb.gimp_xcf_load(1,inputPath, inputPath)


            # Verify if the file is an image.
            if(image != None):

                #layer = pdb.gimp_image_merge_visible_layers(image, gimpfu.CLIP_TO_IMAGE)
                layer = pdb.gimp_image_merge_visible_layers(image, 1)

                # Save the image.
                pdb.file_png_save(image, image.layers[0], outputPath, outputPath, 0, 9, 0, 0, 0, 0, 0)

        except Exception as err:
            gimp.message("Unexpected error: " + str(err))   




'''                
    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)
'''    


register(
        "batch_convert_xcf_to_png",
        "convert chris",
        "convert ",
        "Chris O'Halloran",
        "Chris O'Halloran",
        "2014",
        "<Image>/Filters/Test/Batch batch_convert_xcf_to_png",
        "*",
        [
            (PF_DIRNAME, "inputFolder", "Input directory", ""),
            (PF_DIRNAME, "outputFolder", "Output directory", ""),            
        ],
        [],
        batch_convert_xcf_to_png)



main()