35

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

我的输入图像有多个图层,因此我需要等效于“合并可见图层”的批处理模式,然后是“另存为 PNG”。另请注意,我无法在其中安装任何东西~/.gimp*/scripts/——我需要一个独立的命令行,或者一种在我的源代码树中安装脚本的方法。

请注意,虽然这与这个问题相似,但我有一个额外的限制,我需要使用 GIMP 来完成。我尝试了当前版本的 ImageMagick,它破坏了我的测试图像。

4

5 回答 5

26

在 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

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

我发布这个答案以防万一有人需要一种不使用 GIMP-Python 的方法(可能是因为它没有安装)。

于 2011-05-01T05:45:48.727 回答
14

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

所以,既然你说你不想保存新脚本(你可以这样做,因为你可以在编辑->首选项->文件夹选项上添加新的插件和脚本目录,这样你就不需要写了~ /.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 下的人,这个页面上的说明必须是紧随其后 - 在 gimp 2.8 上应该会变得更容易)

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

于 2011-04-26T23:37:42.183 回答
12

这是我使用 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
于 2013-12-28T12:34:06.010 回答
7

使用 xcftools

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

从文档中:

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

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


(PS。xcftools在我决定发布关于它的答案之后,我发现评论中提到了它,但我还是发布了,因为该评论很容易错过(我看到它是因为我专门检查了它)而且我认为 xcftools 值得一个正确答案的位置,因为它确实是此时最合适的答案。)

于 2016-09-22T11:29:05.967 回答
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()
于 2015-01-07T21:38:47.293 回答