Comment convertir XCF en PNG en utilisant GIMP depuis la ligne de commande?

dans le cadre de mon processus de construction, je dois convertir un certain nombre D'images XCF (format natif de GIMP) en format PNG. Je suis sûr que cela devrait être possible en utilisant le mode batch de GIMP, mais j'ai oublié tout le script-fu que je connaissais.

mes images d'entrée ont plusieurs couches, donc j'ai besoin de l'équivalent en mode batch de" fusionner les couches visibles "suivi de"Enregistrer sous PNG". Notez également que je ne peux pas installer quoi que ce soit dans ~/.gimp*/scripts/ - j'ai besoin d'une ligne de commande autonome, ou un façon d'installer des scripts dans mon arborescence des sources.

notez que bien que cela soit similaire à cette question , j'ai la contrainte supplémentaire que j'ai besoin que cela soit fait en utilisant GIMP. J'ai essayé la version actuelle D'ImageMagick et il casse mes images de test.

24
demandé sur Community 2011-04-26 22:16:00

5 réponses

il y a plusieurs façons de passer par là - ma méthode préférée est toujours de développer un plug-in GIMP-Python. Script-fu utilise l'implémentation scheme intégrée de GIMP, qui est extrêmement médiocre dans la gestion des E/S (telles que la liste des fichiers dans un répertoire) - une tâche absolument triviale en Python.

donc, puisque vous avez dit que vous ne voulez pas enregistrer de nouveaux scripts (vous pouvez le faire parce que vous pouvez ajouter de nouveaux plug-in et les répertoires de scripts sur edit - > preferences- > folder options alors que vous n'avez pas besoin d'écrire sur ~/.GIMP*/plugins/)

de toute façon, vous pouvez ouvrir la console python sous filtres, et coller cet extrait dans l'invite interactive.

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)

cette petite fonction ouvrira n'importe quelle image, passée en chemin de fichier, l'aplatira, et la sauvera en png avec les paramètres par défaut, dans le même répertoire.

en suivant la fonction, vous pouvez simplement taper:

from glob import glob
for filename in glob("*.xcf"):
    convert(filename)

sur le invite interactive à tout convertir .xcf fichiers du répertoire courant .png

(si vous n'avez pas GIMP-python installé, il peut s'agir d'un paquet séparé sur votre distribution linux, il suffit de l'installer en utilisant votre outil préféré - pour ceux sous windows, et gimp-2.6, les instructions sur cette page a doivent être suivies - il devrait devenir plus facile sur gimp 2.8)

une autre façon, tout à fait, s'applique si vos images sont numérotés séquentiellement dans leurs noms de fichiers, tels que myimage_001.xcf, mymage_002.xcf et ainsi de suite. S'ils sont ainsi organisés, vous pouvez installer GIMP-GAP (GIMP animation package) qui permet d'appliquer n'importe quels filtres ou actions dans une telle séquence d'image.

12
répondu jsbueno 2013-11-14 17:28:04

avant que jsbueno ne publie sa réponse, j'avais aussi essayé de demander sur le canal IRC #gimp. J'ai été dirigé vers ce fil sur Gimptalk qui contient le code suivant:

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

ce scriptfu globs pour les fichiers xcf, puis pour chaque fichier il charge le fichier, fusionne les couches visibles, enregistre le résultat en PNG, et" décharge " l'image. Enfin, il quitte GIMP. L'approche glob est utilisée pour éviter de démarrer GIMP pour chaque image. Il a également -marchepieds latéraux de la question de l'obtention de paramètres à partir de la coque dans gimp.

je poste cette réponse juste au cas où quelqu'un aurait besoin d'un moyen pour le faire sans L'utilisation de GIMP-Python (peut-être parce qu'il n'est pas installé).

21
répondu Laurence Gonsalves 2011-05-01 05:45:48

voici ma solution en utilisant GIMP, python-fu de GIMP et bash. Notez que python-fu de GIMP ne peut être exécuté que sous un processus gimp , pas sous Python simple.

#!/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 "151900920"` [-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
répondu Flow 2015-02-27 16:22:10

Utilisation xcftools

il est possible que cet outil n'était pas disponible (ou en tout cas largement connu) au moment où cette question a été posée à l'origine, mais la commande de terminal xcf2png du paquet xcftools fait exactement ce que vous demandez et est très bon. Je l'utilise pour ma thèse de scripts et serait mon choix pour cette question.

de la documentation:

il s'agit d'un ensemble d'outils en ligne de commande rapide pour extraire l'information à partir du format de fichier XCF natif du Gimp.

Les outils sont conçus pour permettre une utilisation efficace des fichiers XCF en couches comme sources dans un système de construction qui utilisent 'make' et des outils similaires pour gérer traitement automatique des graphiques.

ces outils fonctionnent indépendamment du moteur Gimp et ne nécessitent pas le Gimp de même être installé.

"xcf2png" convertit les fichiers XCF au format PNG, aplatissant les couches si nécessaire. L'information de transparence peut être conservée dans l'image, ou un fond la couleur peut être spécifiée sur la ligne de commande.


(PS. J'ai repéré xcftools mentionné dans les commentaires juste après que j'ai décidé de poster une réponse à ce sujet, mais je poste quand même car ce commentaire était facile à manquer (je l'ai vu parce que j'ai spécifiquement vérifié) et je pense que xcftools mérite un bon créneau de réponse, car il est vraiment la réponse la plus appropriée à ce moment-ci.)
3
répondu Tasos Papastylianou 2018-03-21 10:20:02

je sais que ce n'est pas strictement la bonne réponse, mais en voyant comme je me suis dirigé ici tout en cherchant.

j'ai modifié le code d'exemple ici pour créer un plugin utilisable

http://registry.gimp.org/node/28124

il y a un peu de code d'une autre réponse sur cette page""

#!/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
répondu cmoman 2015-01-07 21:38:47