Подтвердить что ты не робот

Как конвертировать XCF в PNG с помощью GIMP из командной строки?

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

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

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

4b9b3361

Ответ 1

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

SO, так как вы сказали, что не хотите сохранять новые скрипты (вы могли бы это сделать, потому что вы можете добавить новые каталоги плагинов и скриптов в опции edit- > preferences- > folder, чтобы вам не нужно было пишите на ~/.gimp */плагины/)

В любом случае, вы можете открыть консоль 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, просто установите его с помощью вашего любимого инструмента - для тех, кто находится под окнами, и gimp-2.6, инструкции по на этой странице, что должно стать проще на gimp 2.8)

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

Ответ 2

Прежде чем jsbueno отправил свой ответ, я также попробовал просить канал IRС#gimp. Я был перенаправлен на этот поток на Gimptalk, который содержит следующий код:

gimp -n -i -b - <<EOF
(let* ( (file (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 (cdr file's))
    )
  (gimp-quit 0)
  )
EOF

Этот скрипт-скрипт для файлов xcf, а затем для каждого файла он загружает файл, объединяет видимые слои, сохраняет результат как PNG и "выгружает" изображение. Наконец, он выходит из GIMP. Глобальный подход используется, чтобы избежать запуска GIMP для каждого изображения. Он также ставит вопрос о получении параметров из оболочки в gimp.

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

Ответ 3

Вот мое решение, использующее GIMP, GIMP python-fu и bash. Обратите внимание, что python-fu GIMP может выполняться только в процессе gimp, а не под простым python.

#!/bin/bash
set -e

while getopts df: OPTION "[email protected]"; 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

Ответ 4

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

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

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

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

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


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

Ответ 5

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

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

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