35

ビルドプロセスの一環として、いくつかのXCF(GIMPのネイティブ形式)画像をPNG形式に変換する必要があります。これはGIMPのバッチモードを使用して可能になるはずですが、私が以前知っていたscript-fuをすべて忘れてしまいました。

入力画像には複数のレイヤーがあるため、「表示されているレイヤーをマージ」の後に「PNGとして保存」に相当するバッチモードが必要です。また、何もインストールできないことにも注意してください~/.gimp*/scripts/。自己完結型のコマンドライン、またはソースツリーにスクリプトをインストールする方法が必要です。

これはこの質問に似ていますが、GIMPを使用してこれを行う必要があるという追加の制約があることに注意してください。ImageMagickの現在のバージョンを試しましたが、テスト画像が壊れています。

4

5 に答える 5

26

jsbuenoが彼の答えを投稿する前に、私は#gimpIRCチャンネルでも質問してみました。次のコードを含む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

このscriptfuはxcfファイルをグロブし、ファイルごとにファイルをロードし、表示されているレイヤーをマージし、結果をPNGとして保存し、画像を「アンロード」します。最後に、GIMPを終了します。globアプローチは、各イメージのGIMPの起動を回避するために使用されます。また、シェルから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の場合は、このページの手順を次のように設定する必要があります。フォロー-gimp2.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から情報を抽出するための高速コマンドラインツールのセットです。
これらのツールは、グラフィックの自動処理を管理するために「make」および同様のツールを使用するビルドシステムのソースとして、レイヤー化されたXCFファイルを効率的に使用できるように設計されています。
これらのツールはGimpエンジンとは独立して機能し、Gimpをインストールする必要はありません。

「xcf2png」はXCFファイルをPNG形式に変換し、必要に応じてレイヤーをフラット化します。透明度情報を画像に保持したり、コマンドラインで背景色を指定したりできます。


(追記:回答を投稿することにした直後にコメントで言及されているのを見つけ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 に答える