Gráficos desde la línea de comando
Gráficos desde la línea de comandos
Contenido:
Obteniendo información
de una imagen
Cambiando el formato de
una imagen
Otras conversiones más
artísticas
Multiples comandos en
una orden a ImageMagick
Gráficos desde la línea de comando
Invierta, redimensione y haga aún más
con ImageMagick
Michael Still (mikal@stillhq.com)
Ingeniero en Software Senior en Tower Software
Julio 16 de 2003
Traducción del artículo publicado previamente en IBM developerWorks, Graphics from the command line.
Traducido por Dardo A. Valdez.
No hay nada que me
agrade más que las herramientas de línea de comando para lidiar con
tareas repetitivas, y la manipulación de imágenes no es una excepción.
Desarrolladores y administradores web agradecerán la posibilidad de
manejar un gran número de archivos fácilmente, ya sea usando la línea
de comandos o scripts. El programador Michael Still nos presenta la
suite ImageMagick, un conjunto de herramientas para Linux que permite
redimensionar, rotar, convertir y manipular imágenes de muchos
formatos, ya sea de a una o de a cien, todas al mismo tiempo.
Este artículo explica como trabajar con imágenes usando
herramientas de línea de comandos. Hago este trabajo habitualmente, ya
que trabajar con varias cámaras digitales a la vez y administrar una
biblioteca de varios miles de fotos. Para los desarrolladores web que
frecuentemente tienen que hacer procesos batch con grandes cantidades
de imágenes, las herramientas de línea de comando son una opción
especialmente atractiva porque permiten ser usadas desde scripts. Pero
incluso si solo quieres editar imágenes un par de veces, la alternativa
de la línea de comandos puede ahorrarte tiempo.
Las herramientas de línea de comandos descriptas en este
artículo son parte de la excelente suite ImageMagick la cual está
incluída en Red Hat Linux y en casi todas las demás distribuciones
populares, también está disponible en la Red (vea Recursos).
ImageMagick también puede usarse desde C, C++, Perl, Python, Java y
varios otros lenguajes, lo cual es muy apreciado por los programadores
que necesitan trabajar con imágenes.
Tienes que saber que hay muchas maneras de hacer las cosas que
explico en este artículo. Solo estoy tratando la manera en que yo trabajo y
que me funciona bien, lo que no significa que no haya otras
herramientas o que ellas no funcionen bien; solo significa que estoy
muy conforme con lo que uso :-)
Este artículo va explicando los procedimientos tomando como
ejemplo problemas específicos a resolver, pero los conceptos deberían
ser aplicables a otros problemas similares también.
Generando thumbnails
La primera cosa que hice con mi colección de fotos (luego de
escanearlas), fue generar thumbnails. También quería reducir el tamaño
original para subirlas a mi sitio web ya que a la gente no le gustaría
tener que esperar a que se cargue una imagen de mis hijos de 1920 x
1440 píxeles.
Como funciona ImageMagick
ImageMagick está implementado como una capa intermedia (y que es usada
por sus comandos), que permite acceder a las funciones de diferentes
librerías de tratamiento de imágenes como por ejemplo libtiff y libpng
(ve en Recursos
para leer mi artículo sobre libtiff). En la terminología de
ImageMagick, se llaman delegados.
Esta es la razón por la que ImageMagick no es tan rápido como lo
sería una aplicación que opere directamente sobre las imágenes, ya que
tiene trabajar genéricamente para tratar con los diferentes modos en
que las distintas librerías representan la información de un archivo de
imagen.
Usé el comando convert , el cual es parte de la
suite ImageMagick. Convert está muy bueno. Aparte de
poder redimensionar una imagen, también puede aplicar anti-alias,
equalizar y difuminar un gran número de imágenes; permite
convertir imágenes entre formatos, recortarlas, agregarles
bordes, invertirlas, unirlas, y mucho más. Lee la página man para más
información sobre las opciones de convert. Muchos de los
efectos visuales más interesantes que se pueden hacer con convert
están explicados más adelante en este artículo.
Vamos a partir de la idea de que quiero hacer un thumbnail de
esta foto muy buena de una rosa:
Para crear un thumbnail con convert, solo usa la
opción -sample. Por ejemplo, digamos que quiero que el
sea de 80 x 40 píxeles. El comando sería:
#
convert -sample 80x40 input.jpg output.jpg Esto crea un thumbnail que se ve así:
Figura 2. Primer intento de creación de
un thumbnail
ImageMagick ajustará el ratio del thumbnail creado para que se
equipare con el de la imagen original. Esto quiere decir que el ratio
del thumbnail del ejemplo sería en realidad de 53 x 40 píxeles,
en vez de los 80 x 40 solicitados. Otra manera de especificar el tamaño
de la imagen de salida es usando porcentajes, esto puede ser
conveniente en el caso de no estar seguro del tamaño de la imagen
original, o si no interesa que el tamaño de la imagen resultante sea
muy exacto, éste es un ejemplo de cómo usar porcentajes:
#
convert -sample 25%x25% input.jpg output.jpg Ahora obtenemos un thumbnail así:
Figura 3. Segundo intento de creación de
un thumbnail
Con este comando puedes generar thumbnails para todas las
imágenes dentro de un directorio y aunque este artículo no es acerca de
scripts de shell, te voy a dar un ejemplo rápido de cómo crear un
thumbnail de cada JPEG de un cierto directorio:
Listado 1. Haciendo thumbnails de todas las
imágenes de un directorio
for img in `ls *.jpg`
do
convert -sample 25%x25% $img thumb-$img
done
Esto producirá una serie de thumbnails al 25% del tamaño de
las imágenes originales, con un nombre de archivo igual al original
pero precedido de thumb-.
Obteniendo
información de una imagen
Otra tarea habitual es determinar las dimensiones de una
imagen. Tal vez, por ejemplo, necesitarías saber que tan grande hacer
el/los thumbnails para el ejempo anterior.
Muchas librerías para tratar imágenes vienen con herramientas
excelentes para este propósito, por ejemplo, libtiff (una librería para
tratar archivos TIFF, he escrito un artículo sobre ella, ve en Recursos),
viene con tiffinfo, el cual muestra la siguiente
información de un archivo TIFF:
#
tiffinfo sample.tif Listado 2. Ejemplo del output de tiffinfo
TIFF Directory at offset 0x146
Image Width: 352 Image Length: 288
Bits/Sample: 8
Compression Scheme: Deflate
Photometric Interpretation: RGB color
Samples/Pixel: 3
Planar Configuration: single image plane
Esto no es un ejemplo exhaustivo de como se usa tiffinfo,
pero se puede ver que devuelve información útil, como el tamaño de la
imagen, la profundidad de colores y el esquema de compresión usado.
Igualmente, existe el comando pnginfo que sirve
para obtener información de la imagen pero para aquellas en formato PNG:
#
pnginfo sample.png Listado 3. Ejemplo del output de pnginfo
sample.png...
Image Width: 640 Image Length: 480
Bitdepth (Bits/Sample): 8
Channels (Samples/Pixel): 3
Pixel depth (Pixel Depth): 24
Colour Type (Photometric Interpretation): RGB
Image filter: Single row per byte filter
Interlacing: No interlacing
Compression Scheme: Deflate method 8, 32k window
Resolution: 0, 0 (unit unknown)
FillOrder: msb-to-lsb
Byte Order: Network (Big Endian)
Number of text strings: 0 of 0
No estoy al tanto de herramientas individuales similares para
otros formatos como BMP, GIF, y JPEG, de todos modos, ImageMagick
hace el trabajo por medio de un comando llamado identify:
#
identify -verbose sample.png Listado 4. Ejemplo del output de identify
Image: sample.png
Format: PNG (Portable Network Graphics)
Geometry: 640x480
Class: DirectClass
Type: true color
Depth: 8 bits-per-pixel component
Colors: 142360
Filesize: 555.6k
Interlace: None
Background Color: grey100
Border Color: #DFDFDF
Matte Color: grey74
Dispose: Undefined
Iterations: 0
Compression: Zip
signature: 361fe70ae623ef6f1fca44e0d29d157c2d701039fcf0f8625862925d881e13a4
Tainted: False
User Time: 0.190u
Elapsed Time: 0:01
Puedes ver que identify muestra gran cantidad de
información útil acerca de la imagen, como tamaño en píxeles,
profundidad de color, y formato de la misma.
pnginfo
Era usuario de libtiff hace bastante tiempo cuando empecé a usar el
formato PNG. En ese momento no existía el equivalente a tiffinfo
para archivos PNG, y por eso escribí pnginfo. (Puedes
bajarlo pnginfo desde el link indicado en Recursos).
identify tiene también la opción -format
que te deja especificar qué información de salida quieres obtener, por
ejemplo, si solo estás interesado en saber cuales son las dimensiones
de la imagen, debería usar un línea de comando como ésta:
#
identify -format \"%wx%h\" sample.png La salida sería algo como esto:
640x480
En el comando, %w significa ancho de la imagen,y
%h sería el alto. Lee la página man de identify
para más información sobre otros parámetros posibles.
Rotando imágenes
Otra tarea que se hace habitualmente es la rotación de
imágenes. Por ejemplo, muchas fotos que tomo con mis cámaras digitales
están rotadas noventa grados, en forma de retrato (\'portrait\'). Mi
cámara no las rota por mi al transferirlas a la computadora, así que
tengo un script que lo hace una vez que las tengo en mi máquina.
Por ejemplo, ésta foto que tomé en Puerto Arturo en Tasmania:
Figura 4. Puerto Arturo visto de costado
Para rotar esta foto, usaremos de nuevo el comando convert:
#
convert -rotate 90 input.jpg output.jpg Esto produce una imagen que se ve así:
Notaste que el argumento para la opción -rotate
es el número de grados a rotar la imagen a la derecha? Para rotarla
hacia la izquierda, usa números negativos.
Cambiando el formato
de una imagen
El comando convert es también capaz de trabajar con el
formato de una imagen, lo que incluye convertir entre formatos como por
ejemplo convertirla de JPEG a PNG, así como convertirlas de color a
escala de grises y operaciones similares.
convert reconoce que formato tienen las imágenes
de entrada y de salida según la extensión de los archivos dada en la
línea del comando, así para convertir un JPEG a PNG, deberías usar algo
como:
#
convert input.jpg output.png ImageMagick soporta 89 formatos de imagen al momento de
escribir este artículo. Ve al sitio de web de ImageMagick Web (ve
en Recursos),
para más información.
Añadiendo texto a
una imagen
A veces se necesita añadir texto a una imagen. Por ejemplo,
imagina que tu compañía tiene una imagen en la tarjeta de presentación
estándar y quiere poner los datos de cada empleado encima de la tarjeta
antes de mandarlas a imprimir, otro ejemplo podría ser la generación de
certificados para gente que ha realizado un curso online en tu sitio
web.
Digamos que tenemos esta imagen:
Figura 6. Una foto del evento Floriade
2002
Podrías poner cierta información que te interese usando el
comando siguiente:
#
convert -font helvetica -fill white -pointsize 36 \\<br>
-draw \'text 10,50 \"Floriade 2002, Canberra, Australia\"\' \\<br>
floriade.jpg comment.jpg y quedaría así:
Figura 7. Una foto con texto informativo
Esto es por lejos el más difícil ejemplo de uso del comando convert,
que voy a dar en este artículo, así que me voy a tomar un tiempo para
explicarlo.
-font helvetica setea la fuente del texto a
Helvetica. Es posible especificar un path a un archivo de fuente
también. Este ejemplo firma la imagen para que no pueda ser usada por
otros sitios web sin permiso, pero lo hace usando una fuente que está
ubicada en un directorio no estándar:
#
convert -font fonts/1900805.ttf -fill white -pointsize 36 \\<br>
-draw \'text 10,475 \"stillhq.com\"\' \\<br>
floriade.jpg stillhq.jpg Este es el resultado:
-fill white rellena las letras con color blanco
en vez de el color negro por defecto.
-pointsize 36 especifica el tamaño de las letras
en puntos, hay 72 puntos en una pulgada.
-draw \'text 10,50 \"...\"\' es un conjunto de
comandos de dibujo, en este caso para mover a la posición 10, 50 (va
entre las comillas simples), y dibujar el texto especificado entre las
comillas dobles (muy útil si quieres dibujar más de una palabra, ya que
no puedes usar comillas dobles dentro de comillas dobles).
Otras conversiones
más artísticas
convert sirve también para hacer una serie de
conversiones más artísticas. Voy a demostrar algunas de las más
visualmente interesantes. Si estás interesado en esto, deberías leer la
página man de ImageMagick e ir su sitio web para obtener más
información. Esta es la imagen que voy a usar para las demostraciones:
Esta foto de Uluru, también conocida como Ayer\'s Rock, fue
tomada al atardecer.
Charcoal
El efecto charcoal (\'carbónico\' ), simula el trazo al carbón
de la
imagen.
#
convert -charcoal 2 input.jpg output.jpg Y el resultado sería algo como esto:
Figura 10. Uluru al atardecer con efecto
charcoal aplicado
Incrementando la magnitud del parámetro de la opción -charcoal
, se aumenta la cantidad de efecto \'carbónico\' aplicado a la imagen,
pero también disminuye un poco la apreciación de la imagen, éste es un
ejemplo con más \'carbónico\':
#
convert -charcoal 10 input.jpg output.jpg Que resulta:
Figura 11. Uluru al atardecer con más
efecto charcoal aplicado
Si realmente quieres exagerar con charcoal:
#
convert -charcoal 200 input.jpg output.jpg Obtendrás algo así:
Figura 12. Uluru
al atardecer con excesivo efecto charcoal aplicado
Especificando tres valores
Para especificar tres valores, uno para el rojo, otro para el verde y
otro para el azul, use un argumento de la forma rojo/verde/azul.
Por ejemplo, 10/20/30 signficaría que el rojo tiene un
valor de 10, el verde 20 y el azul 30. Tambień se pueden usar
porcentajes dentro de este argumento.
Colorize
Colorizado
es el proceso de mezclar el color de cada píxel de la imagen con
un color especificado. El argumento al efecto es el color con el cual
hacer la mezcla y puede darse tanto como un porcentaje (el que se usará
para rojo, verde y azul), o como tres porcentajes; también es posible
dar uno o tres valores.
#
convert -colorize 255 input.jpg output.jpg Aquí se va a Uluru luego de ser colorizada:
Figura 13. Uluru
al atardecer con efecto de colorizado aplicado
Implode
El efecto implode (implosión), simula el que centro de tu
imagen es absorvido por agujero negro virtual. El argumento es la
cantidad de efecto implosivo que quieras.
#
convert -implode 4 input.jpg output.jpg Al implotar Uluru quedaría así:
Figura 14. Uluru al atardecer luego de
ser aplicado el efecto implode
El argumento de solarize
La documentación de ImageMagick que el argumento para solarize
es siempre un porcentaje. Esto no es verdad en todos los casos, si el
argumento tiene un signo de porcentaje al final, entoncens es tratado
como un porcentaje, sino es tratado como un valor literal.
Solarize
El solarizado es un efecto que ocurre cuando un negativo
expuesto a la luz durante el proceso de revelado de una foto. Aquí el
argumento es la intensidad por encima de la cual se aplica el efecto,
ya sea como valor absoluto o como porcentaje del máximo valor posible
para un píxel. Si un píxel está por encima del umbral, entonces se verá
como negativo.
#
convert -solarize 42 input.jpg output.jpg Luego de solarizar, nuestra imagen se ve así:
Figura 15. Uluru al atardecer luego de
ser solarizada
Spread
Spread (\'Esparcir\'), mueve un poco los píxeles
aleatoriamente dentro de la imagen. El argumento es el tamaño del área
alrededor del píxel dentro de la cual se reubicará al píxel, indicando
así que tanto se parece el resultado de la salida a la imagen original.
#
convert -spread 5 input.jpg output.jpg Aquí está Uluru una vez más, luego de haber aplicado el efecto
spread:
Figura 16. Uluru al atardecer luego de
hacer
spreading
Múltiples comandos
en una sola orden a ImageMagick
Ya viste un ejemplo de como encadenar comandos con los
ejemplos de inclusión de texto en imágenes. Así también es posible,
encadenar cualquiera de los comandos de ImageMagick mencionados en este
artículo. Por ejemplo, tal vez quisiéramos crear el thumbnails de un
imagen, luego aplicarle el efecto spread, y después el efecto
charcoal:
#
convert -sample 25%x25% -spread 4 \\
-charcoal 4 input.jpg output.jpg Esto produce:
Figura 17. Uluru luego de aplicar
efectos encadenados
Tips para manipular
imágenes
Hay ciertas cosas que deberías saber acerca de la manipulación
de imágenes antes de apurarte y empezar a modificar cada imagen que
tengas en el disco rígido. Primero, deberías pensar un poco acerca de
cual formato vas a usar a largo plazo, para no terminar con muchas
imágenes en un determinado formato que no deseas. Esto es bastante
fácil de solucionar usando convert
para cambiar el formato de las imágenes tal como ya se explicó.
El formato de compresión JPEG es muy bueno para imágenes como
las fotografías. Pero recuerda que la compresión es por lo general \'lossy\' - a
pérdida \' - dicho de otra manera cierta cantidad de datos de la imagen
son descartados (y eliminados), como parte del proceso de compresión.
Esto hace que el JPEG sea un formato no recomendable si necesitas, por
ejemplo, comprimir imágenes de texto escaneado o aplicado (como ya se
vió antes), que luego debería ser legible. Lo otro que hay que tener en
mente es que la pérdida es acumulativa.
PNG es usualmente un buena opción para imágenes de color en
las que no quieres acumular pérdidas que afecten la calidad de la
imagen luego de una serie de manipulaciones.
Lee de mi serie de artículos \"Graphics programming with
libtiff, Part 2\" (Programación gráfica con libtiff, Parte 2), artículo
en el cual trato este tema con respecto a libtiff en más profundidad.
(ve el link en Recursos
abajo).
También deberías recordar que muchas de las manipulaciones
mostradas y explicadas en este artículos no tienen vuelta atrás. Así
que una vez que achicaste una imagen no puedes deshacer el cambio, si
decides agrandarla de todos modos, el resultado se verá bastante
pixelado. Por ejemplo, tomemos una foto, hagamos un thumbnail y luego
expandamos la imagen de nuevo, para ahorrar espacio incluyo solo las
imágenes del antes y el después saltándome el thumbnail intermedio.
Ahora, encadenamos la reducción con una posterior expansión:
#
convert -sample 10% -sample 1000% input.jpg output.jpg Esto produce una imagen que se ve así:
Figura 19. Una cascada pixelada
Es bastante difícil ver la cascada en la imagen terminada,
aunque estrechando un poco los ojos puede ayudar :-)
Conclusiones
En este artículo hemos discutido algunas de las más
interesantes características que hacen que ImageMagick pueda ganarse un
lugar en tu caja de herramientas para tratar imágenes. Las herramientas
descriptas aquí no son la respuesta a todo problema imaginable, y a
veces necesitan un poco de código para hacer el trabajo, pero como
herramientas genéricas para tratamiento de imágenes pueden ahorrar un
montón de tiempo.
Recursos
- Baja ImageMagick
de su sitio web y encuentra también otros recursos ahí.
- \"Graphics
programming with libtiff\" (developerWorks,
Marzo de 2002) trata sobre conceptos de imágenes en blanco y negro con
enfoque en particular del formato TIFF.
- \"Graphics
programming with libtiff, Part 2\" (developerWorks,
Junio de 2002) trata el tema de la imágenes TIFF de color, pero también
discute importante tópicos como el esquema adecuado de compresión a
usar.
- El comando pnginfo es
parte de la suite pngtools.
- \"Govern your
images with JSP code\" (developerWorks,
Noviembre de 2002), explica como usar JSP (JavaServer Pages), para
administrar dinámicamente el manejo de imágenes bajadas por los
visitantes de tu sitio web.
- SFGraph es
un framework de alphaWorks para la compresión y despliegue de imágenes
de alta resolución.
- Encuentra más recursos para
desarrolladores
Linux en la zona Linux de developerWorks.
Acerca del
Autor
Michael ha
estado trabajando en el campo del procesamiento de imágenes desde hace
varios años, incluyendo un tiempo en el que administró y desarrolló
grandes bases de datos de imágenes para un departamento del gobierno de
Australia. Actualmente trabaja para Tower Software que importante
software EDMS y el paquete de administracion de registros TRIM. Michael
también es el desarrollador detrás de una API de código abierto para la
generación de PDFs, así como de otros varios proyectos de código
abierto. Puedes contactar a Michael en mikal@stillhq.com
