Как конвертировать XCF в PNG с помощью GIMP из командной строки?
В рамках моего процесса сборки мне нужно преобразовать несколько изображений формата XCF (GIMP native format) в формат PNG. Я уверен, что это должно быть возможно, используя пакетный режим GIMP, но я забыл все script -fu, которые я знал.
Мои входные изображения имеют несколько уровней, поэтому мне нужен эквивалент пакетного режима "слияние видимых слоев", за которым следует "сохранить как PNG". Также обратите внимание, что я не могу установить что-либо в ~/.gimp*/scripts/
- мне нужна автономная командная строка или способ установки скриптов в исходное дерево.
Обратите внимание, что, хотя это похоже на этот вопрос, у меня есть дополнительное ограничение, которое мне нужно, чтобы это было сделано с помощью GIMP. Я пробовал текущую версию ImageMagick, и она искажает мои тестовые изображения.
Ответы
Ответ 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()