Jak przekonwertować XCF do PNG za pomocą GIMP z wiersza poleceń?
W ramach mojego procesu budowania muszę przekonwertować kilka obrazów XCF (natywny format GIMP) do formatu PNG. Jestem pewien, że powinno to być możliwe przy użyciu trybu wsadowego GIMP ' a, ale zapomniałem o całym script-fu, który znałem.
Moje obrazy wejściowe mają wiele warstw, więc potrzebuję odpowiednika trybu wsadowego "scalanie widocznych warstw", a następnie"zapisz jako PNG". Zauważ również, że nie mogę zainstalować niczego w ~/.gimp*/scripts/
- potrzebuję samodzielnego wiersza poleceń, lub sposobu na zainstalowanie skryptów w moim źródło.
Zauważ, że chociaż jest to podobne do tego pytania , mam dodatkowe ograniczenie, że muszę to zrobić za pomocą GIMP. Wypróbowałem aktualną wersję ImageMagick i zniekształca moje obrazy testowe.
5 answers
Jest kilka sposobów, aby przejść przez to - moją preferowaną metodą jest zawsze tworzenie wtyczki GIMP-Python. Script-fu wykorzystuje wbudowaną implementację programu GIMP, która jest bardzo słaba w obsłudze I / O (takich jak wypisywanie plików w katalogu) - zadanie, które jest absolutnie trywialne w Pythonie.
Więc skoro powiedziałeś, że nie chcesz zapisywać nowych skryptów (możesz to zrobić, ponieważ możesz dodać nową wtyczkę i katalogi skryptów w opcji Edycja - > Preferencje - >Opcje folderów, aby nie trzeba było napisz na~/.gimp* / plugins/)
W każdym razie, możesz otworzyć konsolę Pythona w sekcji Filtry i wkleić ten fragment w interaktywnym monicie.
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)
Ta mała funkcja otworzy dowolny obraz, przekazany jako ścieżka do pliku, spłaszczy go i zapisze jako png z domyślnymi ustawieniami w tym samym katalogu.
Po wywołaniu funkcji można po prostu wpisać:
from glob import glob
for filename in glob("*.xcf"):
convert(filename)
Na interaktywnym monicie, aby przekonwertować wszystkie .plików xcf W bieżącym katalogu do .png
(Jeśli nie masz gimp-GIMP GIMP-python zainstalowany, może to być oddzielny pakiet w dystrybucji Linuksa, po prostu zainstaluj go za pomocą ulubionego narzędzia - dla tych pod windows, a gimp-2.6, instrukcje na ta strona ma muszą być przestrzegane-powinno stać się łatwiejsze w gimp 2.8)
Inny sposób ma zastosowanie, jeśli obrazy są kolejno ponumerowane w nazwach plików, takich jak myimage_001.xcf, mymage_002.xcf i tak dalej. GIMP-GIMP-Gap (gimp animation pakiet), który pozwala na zastosowanie dowolnych filtrów lub akcji w takiej sekwencji obrazu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-14 17:28:04
Zanim jsbueno opublikował swoją odpowiedź, próbowałem też zapytać na kanale IRC # gimp. Zostałem przekierowany do tego wątku na Gimptalk który zawiera następujący kod:
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
Ten skrypt jest zapisywany dla plików xcf, a następnie dla każdego pliku ładuje plik, łączy widoczne warstwy, zapisuje wynik jako PNG i "rozładowuje" obraz. W końcu kończy GIMP. Podejście glob służy do uniknięcia uruchamiania GIMP dla każdego obrazu. To również krok po kroku problem uzyskiwania parametrów z powłoka do gimp ' a.
Zamieszczam tę odpowiedź na wypadek, gdyby ktoś potrzebował sposobu, aby to zrobić bez użycia GIMP-Python (być może dlatego, że nie jest zainstalowany).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-01 05:45:48
GIMP, GIMP ' s python-fu i bash to moje rozwiązanie. Zauważ, że Python-fu w GIMP może być uruchamiany tylko pod procesem gimp
, a nie pod zwykłym Pythonem.
#!/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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-27 16:22:10
Użyj xcftools
Możliwe, że to narzędzie nie było dostępne (lub w każdym razie powszechnie znane) w momencie, gdy to pytanie zostało pierwotnie zadane, ale xcf2png
polecenie terminal z xcftools
pakiet robi dokładnie to, o co prosisz i jest bardzo dobry. Używam go do moich skryptów pracy dyplomowej i byłby moim wyborem na to pytanie.
Z dokumentacji:
Jest to zestaw szybkich narzędzi wiersza poleceń do wydobywania informacji od Gimp ' a natywny format pliku XCF.
Narzędzia zostały zaprojektowane tak, aby umożliwić efektywne wykorzystanie warstwowych plików XCF jako źródła w systemie budowania, które wykorzystują "make" i podobne narzędzia do zarządzania automatyczne przetwarzanie grafiki.
narzędzia te działają niezależnie od silnika Gimp i nie wymagają Gimp do zainstalowania.
"xcf2png" konwertuje pliki XCF do formatu PNG, spłaszczając warstwy, jeśli konieczne. Informacje o przejrzystości można przechowywać w obraz, czyli tło kolor można określić w wierszu poleceń.
(PS. Zauważyłem
xcftools
wymienione w komentarzach tuż po tym, jak zdecydowałem się opublikować odpowiedź na ten temat, ale i tak publikuję, ponieważ ten komentarz był łatwy do przeoczenia (widziałem go, ponieważ specjalnie go sprawdziłem) i myślę, że xcftools zasługuje na właściwą odpowiedź, ponieważ naprawdę jest to najbardziej odpowiednia odpowiedź w tym momencie.)Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 10:20:02
Wiem, że nie jest to ściśle poprawna odpowiedź, ale widząc, że zostałem skierowany tutaj podczas wyszukiwania.
Zmodyfikowałem przykładowy kod tutaj, aby utworzyć funkcjonalną wtyczkę
Http://registry.gimp.org/node/28124
Na tej stronie znajduje się fragment kodu z innej odpowiedzi
#!/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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-07 21:38:47