xcf2jpg - Un conversor de XCF a JPG

8 mins

Uso intensamente el Gimp para retoque fotográfico, de manera que genero muchos archivos XCF. Este es el formato propio del Gimp, el que ofrece todas las posibilidades, básicamente, múltiples capas e imágenes sin las perdidas propias de los algoritmos de compresión. Por supuesto, cuando tengo que mandar a copiar al laboratorio o publicar electrónicamente, tengo que exportarlas a un formato mas apropiado como el JPG, esto se logra desde el mismoGimp, mediante el “Salvar Como”, sin embargo siempre me resultó molesto, tener que hacer esta conversión, archivo por archivo, particularmente cuando son muchos, demasiados movimientos y “clicks” del mouse, para algo tan estándar y aburrido. De manera que me puse a buscar alguna herramienta que me permitiera decir: “toma todos estos archivos y convertírmelos en Jpg, mientras tanto yo me tomo un mates o navego por la web”. No hay muchas herramientas que manejen el formato XCF, obviamente el Gimp, el increíble ImageMagick , el GwenView , El gtkmmviewer , el ShowImg y el XnView , mi idea inicial era trabajar con el convert del ImageMagick, un software de línea de comandos de la ostia, se podría decir que es un PhotoShop o un Gimp, por línea de comandos. Lamentablemente con el convert no conseguí manejar correctamente las distintas capas, no logré hacer un “flatten” correcto, el otro inconveniente es un viejo problema de este software, te “comen” la CPU, es en serio, no podés ni mover el mouse mientras se ejecuta algunas de sus funciones. La otra opción, el GwenView, parecía una buena alternativa, los “thumbnails” que genera de los archivos xcf, manejaban correctamente las distintas capas, pero el salvar como Jpg, no se por que extraña razón no, siempre exporta la primer capa. Las otras aplicaciones no llegué a probarlas ya que volví a las fuentes, es decir, usar el Gimp, con algún código Script-Fu para automatizar las tareas y el modo “batch” para poder ejecutar todo por línea de comandos, sin intervención del usuario. El Script-Fu, para aquellos que recién empiezan con estas cosas, es el lenguaje “nativo” para macros del Gimp, hay varios otros, pero este lo vas a en encontrar en cualquier implementación de este programa de edición. En realidad se trata de Scheme una variante del Lisp, un antiguo lenguaje que goza de muy buena salud en ciertos ámbitos. Ya lo conocía por haber jugado con macros para el editor Emacs, aunque siempre me resultó un poco difícil para mí, buscando, encontré un comentario de Martin Kretzschmar en una lista de correo con un script para exportar un xcf a un bitmap, de manera que jugando un poco con esto y el Bash, armé un script que realiza el trabajo que necesito. Básicamente, lo que hace es construir un script-fu, el cual carga el Xcf, Aplana todas las capas, redimesiona la imagen si así se lo pedimos, aplica un algoritmo de Sharpening también a pedido, y por último salva todo en un archivo jpg. Este Script se lo pasamos como parámetro al Gimp en modo batch, y este se encarga de hacer todo. Este herramienta la llamé xcf2jpg (muy original lo mío), y funciona con dos parámetros obligatorios, archivo de entrada y de salida, el resto es opcional, el porcentaje de compresión (0.85 por defecto), el comentario (editenlo ya que por defecto hay un copyright mío), el ancho (para redimensionar) y el monto de sharpening si se quiere.

Algunas consideraciones

  • Se necesita bash o similar, supongo que en Windows se podría usar el Cygwin, pero no lo probé.
  • El cambio de tamaño funciona simplemente estableciendo un nuevo ancho, el alto se calcula manteniendo la proporción de la imagen.
  • Acepta archivos comprimidos con bz2, es decir los xcf comprimidos con este algoritmo.
  • Para generar copias para el laboratorio se puede ejecutar: xcf2jpg input.xcf output.jpg 1 “” “” 30, esto es, un jpg sin compresión y con un poco de “sharpening”.
  • Para publicar en la web: xcf2jpg input.xcf output.jpg 0.85 “” 1024 30, o sea, un 85% de compresión, ancho de 1024 pixels y un poco de “sharpening”.

Por último, se puede exportar un conjunto de archivos de una carpeta, mediante esta sencilla instrucción en bash:

for i in *.xcf*; do xcf2jpg $i `basename $i xcf`jpg ”” ”” 1024 30; done

Bueno, lo adjunto en este post, por si a alguien le interesa, si así fuera, un comentario (alimento del ego) se agradece.

#!/bin/sh
#
# $Copyright (C) 2006 Patricio Moracho
# 
# xcf2jpg is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
# 
# Filename : xcf2jpg
# Description : Export XCF (Gimp) files into Jpg
# Usage  : xcf2jpg input.xcf output.jpg quality comment new_width sharp_amount
#
# Notas (sorry, in spanish)
#  1. Los únicos parámetros obligatorios son el archivo de entrada y el de salida
#  2. El parámetro quality determina el % de compresión jpeg. Por defecto esta configurado en 0.85 (85%)
#  3. El comentario se debe definir encerrado entre comillas
#  4. Para redimensionar el archivo configurar new_width con el nuevo ancho, el alto se recalcula
#  5. Se puede aplicar el algoritmo de Sharpen, simplemente configurar el monto de sharp en sharp_amount,
#     Por defecto no se usa.
#  6. Archivos para el laboratorio: xcf2jpg input.xcf output.jpg 1 "" "" 30
#  7. Archivos para publicar en la web: xcf2jpg input.xcf output.jpg 0.85 "" 1024 30
#  8. Acepta archivos xcf comprimidos con bzip2
#set -x

GIMP=/usr/bin/gimp

usage()
{
 echo ""
 echo "xcf2jpg - An Xcf Gimp file conversion to jpeg (needs Gimp)"
 echo "by marlowe (pmoracho@gmail.com)"
 echo ""
 echo "usage: xcf2jpg input.xcf output.jpg quality comment new_width new_height sharp_amount"
 echo ""
}

# Default values
quality="0.85"
comment="© by marlowe\n \nEdited with Gimp." 
new_width=0
new_height=0
do_resize=""
do_sharp=""
sharp_amount=0

if [ -z "$1" ]; then usage; exit 0; fi
if [ -z "$2" ]; then usage; exit 0; fi
if [ -n "$3" ]; then quality=$3; fi
if [ -n "$4" ]; then comment=$4; fi
if [ -n "$5" ]; then new_width=$5; fi
if [ -n "$6" ]; then new_height=$6; fi
if [ -n "$7" ]; then sharp_amount=$7; fi

#
# Resize script
#
if [ $new_width -ne 0 ]; then 
 do_resize="
  (if (> width height)
   (gimp-image-scale img $new_width  (trunc (/ (* height $new_width) width)))
   (gimp-image-scale img (trunc (/ (* width $new_height) height)) $new_height)
  )"
fi

#
# input is xcf bziped?
#
case $1 in
 *.bz2)
  file_load="file-bz2-load";;
 *)
  file_load="gimp-xcf-load";;
esac

#
# Sharpen image script
#
#  (plug-in-sharpen 1 img layer $sharp_amount)

if [ $sharp_amount -ne 0 ]; then
 do_sharp="
  (plug-in-refocus 1 img layer 4 3.4 1.2 9.5 1)
 "
fi

#
# Main script fu
#

script_fu="
(let* (
 (in-name \"$1\")
 (out-name \"$2\")
 (img (car ($file_load 0 in-name in-name)))
 (width (car (gimp-image-width img)))
 (height (car (gimp-image-height img)))
 (layer (car (gimp-image-flatten img)))
 )
 $do_resize
 $do_sharp
 (file-jpeg-save 1 img layer out-name out-name $quality 0.0 0 0 \"$comment\" 0 0 0 1 )
 (gimp-image-delete img)
 (gimp-quit 0))
"

#
# Run Gimp in batch mode
#
# echo "$script_fu"

$GIMP -i -d -c --batch-interpreter "plug-in-script-fu-eval" -b "$script_fu" 2>/dev/null

Nota: Hay otro xcf2jpg, en este caso directamente un plugin de Eiji Kushida, hace básicamente lo mismo, pero desde el Gimp.


Si te gustó o te resulto útil lo que has leído y tienes las ganas de colaborar con el autor, puedes hacerlo a través:

@pmoracho QR code
https://pmoracho.github.io/blog/2005/05/05/Xcf2jpg/
05-May-05
BY-NC-SA 4.0 https://pmoracho.github.io/disclosure
https://pmoracho.github.io/blog/2005/05/05/Xcf2jpg/