image-manipulation - una - formato de imagen transparente
¿Cómo convertir XCF a PNG usando GIMP desde la línea de comandos? (5)
Como parte de mi proceso de compilación, necesito convertir varias imágenes XCF (formato nativo de GIMP) al formato PNG. Estoy seguro de que esto debería ser posible utilizando el modo por lotes de GIMP, pero he olvidado todo el script-fu que solía conocer.
Mis imágenes de entrada tienen varias capas, por lo que necesito el modo de proceso por lotes equivalente a "combinar capas visibles" seguido de "guardar como PNG". También tenga en cuenta que no puedo instalar nada en ~/.gimp*/scripts/
- Necesito una línea de comandos autocontenida o una forma de instalar scripts en mi árbol de fuentes.
Tenga en cuenta que si bien esto es similar a esta pregunta , tengo la restricción adicional de que necesito que esto se haga con GIMP. Probé la versión actual de ImageMagick y maneja mis imágenes de prueba.
Antes de que jsbueno publicara su respuesta, también había intentado preguntar en el canal IRC #gimp. Me dirigieron a este hilo en Gimptalk que contiene el siguiente código:
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
Este scriptfu globs para archivos xcf, y luego para cada archivo carga el archivo, combina las capas visibles, guarda el resultado como un PNG y "descarga" la imagen. Finalmente, abandona GIMP. El enfoque global se utiliza para evitar iniciar GIMP para cada imagen. También evita el problema de obtener parámetros de la shell en gimp.
Estoy publicando esta respuesta en caso de que alguien necesite una forma de hacerlo sin el uso de GIMP-Python (quizás porque no está instalado).
Aquí está mi solución utilizando GIMP, python-fu y bash de GIMP. Tenga en cuenta que python-fu de GIMP solo se puede ejecutar en un proceso de gimp
, no en 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 $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
Hay algunas maneras de pasar por esto: mi método preferido es siempre desarrollar un complemento GIMP-Python. Script-fu utiliza la implementación del esquema integrado de GIMP, que es extremadamente deficiente en el manejo de E / S (como enumerar archivos en un directorio), una tarea que es absolutamente trivial en Python.
SO, ya que dijo que no desea guardar nuevos scripts (puede hacerlo porque puede agregar nuevos directorios de complementos y scripts en las opciones de carpeta editar-> preferencias-> para que no necesite escribir en ~ /.gimp*/plugins/)
De todos modos, puede abrir la consola de Python bajo los filtros y pegar este fragmento en el indicador interactivo.
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)
Esta pequeña función abrirá cualquier imagen, se pasará como una ruta de archivo, la aplanará y la guardará como un png con la configuración predeterminada, en el mismo directorio.
Siguiendo la función, simplemente puede escribir:
from glob import glob
for filename in glob("*.xcf"):
convert(filename)
En el indicador interactivo para convertir todos los archivos .xcf en el directorio actual a .png
(Si no tiene gimp-python instalado, puede ser un paquete separado en su distribución de Linux, solo instálelo usando su herramienta favorita, para aquellos bajo Windows y gimp-2.6, las instrucciones en esta página tienen que ser seguido - debería ser más fácil en gimp 2.8)
Otra forma, en conjunto, se aplica si sus imágenes están numeradas secuencialmente en sus nombres de archivo, como myimage_001.xcf, mymage_002.xcf y así sucesivamente. Si están dispuestos, podría instalar GIMP-GAP (paquete de animación gimp) que le permite a uno aplicar cualquier filtro o acción en dicha secuencia de imágenes.
Sé que esta no es la respuesta estrictamente correcta, pero al ver como me dirigieron aquí mientras buscaba.
He modificado el código de ejemplo aquí para crear un complemento viable
http://registry.gimp.org/node/28124
Hay un poco de código de otra respuesta en esta página
#!/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()
Utilizar xcftools
Es posible que esta herramienta no estuviera disponible (o, en todo caso, ampliamente conocida) en el momento en que se hizo esta pregunta originalmente, pero el xcf2png
terminal xcftools
paquete xcftools
hace exactamente lo que usted pregunta y es muy bueno. Lo uso para mis guiones de tesis y sería mi opción para esta pregunta.
De la documentación:
Este es un conjunto de herramientas rápidas de línea de comandos para extraer información del formato de archivo nativo de Gimp XCF.
Las herramientas están diseñadas para permitir el uso eficiente de archivos XCF en capas como fuentes en un sistema de compilación que usa herramientas ''make'' y similares para administrar el procesamiento automático de los gráficos.
Estas herramientas funcionan independientemente del motor Gimp y no requieren que Gimp esté instalado.
(PS. Vi a"xcf2png" convierte archivos XCF a formato PNG, aplanando capas si es necesario. La información de transparencia se puede mantener en la imagen o se puede especificar un color de fondo en la línea de comandos.
xcftools
mencionado en los comentarios justo después de que decidí publicar una respuesta al respecto, pero estoy publicando de todos modos ya que ese comentario fue fácil de omitir (lo vi porque lo revisé específicamente) y creo que xcftools merece la ranura de una respuesta correcta, ya que realmente es la respuesta más apropiada en este momento.)