Как конвертировать XCF в PNG с помощью GIMP из командной строки? - PullRequest
27 голосов
/ 26 апреля 2011

В рамках процесса сборки мне нужно преобразовать несколько изображений XCF (родной формат GIMP) в формат PNG.Я уверен, что это возможно при использовании пакетного режима GIMP, но я забыл все сценарии, которые я знал.

Мои входные изображения имеют несколько слоев, поэтому мне нужен пакетный режим, эквивалентный "объединить видимые слои "с последующим" сохранить как PNG ".Также обратите внимание, что я ничего не могу установить в ~/.gimp*/scripts/ - мне нужна отдельная командная строка или способ установки сценариев в моем дереве исходников.

Обратите внимание, что хотя это похоже на этот вопрос , у меня есть дополнительное ограничение, которое мне нужно сделать, используя GIMP.Я попробовал текущую версию ImageMagick, и она искажает мои тестовые изображения.

Ответы [ 5 ]

24 голосов
/ 01 мая 2011

До того, как jsbueno опубликовал свой ответ, я также пытался спросить на IRC-канале #gimp. Я был направлен на эту тему на 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. Глобальный подход используется, чтобы избежать запуска GIMP для каждого изображения. Это также обходит проблему получения параметров из оболочки в gimp.

Я публикую этот ответ на тот случай, если кому-то понадобится способ сделать это без использования GIMP-Python (возможно, потому что он не установлен).

14 голосов
/ 27 апреля 2011

Есть несколько способов пройти через это - мой предпочтительный метод всегда разрабатывать плагин GIMP-Python.Script-fu использует встроенную схему GIMP, которая крайне плохо справляется с обработкой операций ввода-вывода (например, перечисление файлов в каталоге) - задача, которая в Python абсолютно тривиальна.

SO, так как вы сказалиВы не хотите сохранять новые скрипты (вы можете сделать это, потому что вы можете добавить новый плагин и каталоги скриптов в edit-> Предпочтения-> Параметры папки, так что вам не нужно писать в ~ / .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, просто установите его, используя фавориte tool - для тех, кто работает под windows и gimp-2.6, инструкции на на этой странице должны соблюдаться - на gimp 2.8 должно стать проще)

В целом применяется другой способесли ваши изображения последовательно пронумерованы в именах файлов, таких как myimage_001.xcf, mymage_002.xcf и так далее.Если они устроены так, вы можете установить GIMP-GAP (пакет анимации gimp), который позволяет применять любые фильтры или действия в такой последовательности изображений.

11 голосов
/ 28 декабря 2013

Вот мое решение, использующее GIMP, python-fu и bash для GIMP. Обратите внимание, что Python-fu GIMP может быть запущен только в процессе 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
5 голосов
/ 22 сентября 2016

Использовать xcftools

Возможно, что этот инструмент не был доступен (или в любом случае широко известен) в то время, когда этот вопрос был задан изначально, но команда терминала xcf2pngиз пакета xcftools делает именно то, что вы просите, и это очень хорошо.Я использую его для своих дипломных сценариев и был бы моим выбором для этого вопроса.

Из документации:

Это набор быстрых инструментов командной строки для извлеченияинформация из собственного формата файлов Gimp XCF.
Эти инструменты предназначены для эффективного использования многоуровневых файлов XCF в качестве источников в системе сборки, использующих make и аналогичные инструменты для управления автоматической обработкой графики.
Эти инструменты работают независимо от движка Gimp и не требуют даже установки Gimp.

"xcf2png" преобразует файлы XCF в формат PNG, выравниваяслои при необходимости.Информация о прозрачности может быть сохранена на изображении, или цвет фона может быть указан в командной строке.


(PS. Я заметил xcftools, упомянутый в комментариях сразу послеЯ решил опубликовать ответ об этом, но в любом случае я публикую его, так как этот комментарий было легко пропустить (я увидел его, потому что специально проверил его), и я думаю, что xcftools заслуживает правильного места для ответа, так как он действительно является наиболее подходящимответ на данный момент.)
1 голос
/ 08 января 2015

Я знаю, что это не совсем правильный ответ, но, видя, как меня направили сюда во время поиска.

Я изменил пример кода здесь, чтобы создать работающий плагин

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()
...