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.

Author: Community, 2011-04-26

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.

 12
Author: jsbueno,
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).

 21
Author: Laurence Gonsalves,
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
 9
Author: Flow,
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.)
 3
Author: Tasos Papastylianou,
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()
 1
Author: cmoman,
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