Multimedia

Multimedia (41)

Comandos de ImageMagick I: convert y mogrify

16 Agosto 2018 by 0 Comment Multimedia 7018 Views

ImageMagick no es un único progrma, sino un conjunto de comandos complementarios, pero cada uno con unas funcionalidades distintas. En esta ocasión veremos convert y mogrify, dos comandos que realizan modificaciones sobre ficheros de imágenes, pero con una diferencia fundamental: convert genera un nuevo fichero con las modificaciones mientras que mogrify aplica las modificaciones sobre el fichero origen. 

Con mogify ahorramos espacio en disco ya que no generamos nuevos ficheros, pero sus cambios son irreversibles. 

Con convert mantenemos la imagen original intacta, pero, a cambio, consumimos espacio en disco con cada nuevo fichero. Y cuando generamos vídeos u otros procesos en lotes grandes, a veces corremos el riesgo de llenar el disco duro del ordenador, máxime si hacemos vídeos con ratios de 60 fotogramas por segundo y en 4k. (Cada fotograma en png puede pesar 7/8 Mb x 60 fotogramas por segundo, podemos estar generando entre 400 y 500 Mb por cada segundo de vídeo. ¡Más de 20 Gb por minuto! Y si a esto le añadimos los ficheros auxiliares que podamos usar para generar el vídeo, como cartelas, fotogramas para superponer, subtítulos, degradados... tenemos que trabajar con cuidado. iremos viendo cómo optimizar el trabajo. 

Uso de convert y mogrify


Dado que la principal diferencia entre convert y mogrify es que con convert genera un nuevo fichero y que mogrify no lo genera, a la hora de invocarlos, con convert deberemos especificar el nombre del nuevo fichero y con mogrify no hace falta, ya que sobreescribe el fichero de origen. 

Veamos el uso más habitual de estos comandos:

convert imagenoriginal.png -parametro valor imagendestino,png
mogrify -parametro valor imagenoriginal.png

Y ahora, un ejemplo real sobre el fichero torres.jpg:

torres.jpg

convert torres.jpg -negate torresnegadas.jpg

torresnegadas.jpg

Y seguimos teniendo la imagen original:

ls
torres.jpg  torresnegadas.jpg

Ahora, probemos con mogrify:
mogrify -negate torres.jpg
Seguimos teniendo dos ficheros:
ls
torres.jpg  torresnegadas.jpg

Pero ambos son iguales:

torresnegadas.jpg

torres.jpg

 

El orden importa

Como es obvio, si en convert ponemos primero el fichero de destino antes que el de origen, no podrá leer el fichero original y por lo tanto, no podrá procesar las modificaciones:

convert alapiz.png -charcoal 1 torres.jpg 
convert.im6: unable to open image `alapiz.png': No existe el archivo o el directorio @ error/blob.c/OpenBlob/2638.
convert.im6: unable to open file `alapiz.png' @ error/png.c/ReadPNGImage/3667.
convert.im6: no images defined `torres.jpg' @ error/convert.c/ConvertImageCommand/3044.

Por lo que tenemos que escribir bien el orden:
convert torres.jpg -charcoal 1 alapiz.jpg
alapiz.jpg
Con mogrify también es importante el orden, si escribimos el fichero antes de las modificaciones, no las aplica, ya que no sabe qué modificaciones aplicar al fichero:

mogrify torresnegadas.jpg -charcoal 1
torresnegadas.jpg
Sin embargo, si escribimos las modificaciones antes del fichero, las aplica:

mogrify -charcoal 1 torresnegadas.jpg

torresnegadas.jpg


Diferencias entre convert y mogrify cuando no hay fichero de origen

Generar lienzos

Convert puede generar ficheros desde 0, mogrify, no. Como vimos en el artículo sobre la generación de lienzos con ImageMagick, con el modificador xc de convert e indicando el tamaño, podemos generar lienzos:
convert -size 500x250 xc:red imagenroja.jpg

imagenroja.jpg

 Pero con mogrify no:

convert -size 500x250 xc:red imagenroja.jpg
mogrify.im6: no encode delegate for this image format 'blue' @ error/constitute.c/WriteImage/1209.
mogrify.im6: unable to open image `imagenazul.jpg': No existe el archivo o el directorio @ error/blob.c/OpenBlob/2638.

Textos


Con convert podemos crear una imagen con un texto con la siguiente instrucción:
convert -size 500x250 -gravity Center -background blue -font FreeMono-Negrita label:"Linux Center" cartela_Linux_Center.jpg

cartela_Linux_Center.jpg
Y con mogrify, básicamente igual que cuando generamos un lienzo: :

mogrify -size 500x250 -gravity Center -background green -font FreeMono-Negrita label:"Linux Center" cartela_Linux_Center_verde.jpg

mogrify.im6: no encode delegate for this image format 'Linux Center' @ error/constitute.c/WriteImage/1209.
mogrify.im6: unable to open image `cartela_Linux_Center_verde.jpg': No existe el archivo o el directorio @ error/blob.c/OpenBlob/2638.

Así que, si no hay imagen previa, no queda otra opción que usar convert. Por lo demás, la diferencia es si queremos crear nuevo fichero o no. 

Leer más ...

¿Qué es ImageMagick?

15 Agosto 2018 by 0 Comment Multimedia 9326 Views

Introducción



ImageMagick es una suite de edición de imágenes en modo consola. Es decir, es un conjunto de comandos para trabajar con imágenes, con una serie de comandos que cada uno realiza una serie de procesos para cubrir todo el abanico de necesidades que un usuario pueda tener para cualquier actividad gráfica, tanto con mapa de bits como con vectores. 

ImageMagick tiene una serie de características que le convierten en una herramienta muy útil para cualquier diseñador gráfico, fotógrafo o simplemente aficionados a la imagen, pero también para el trabajo con vídeo, ya que, en esencia, un vídeo no es más que una sucesión de imágenes. 

  • Es software libre, por lo que, además todas la implicaciones que conlleva la libertad, garantiza que su calidad es muy superior a cualquier programa privativo, al tener una comunidad de desarrolladores que soluciona cualquier problema que pudiera tener, así como una continua evolución adaptándose siempre a las demandas de los usuarios.
  • Es multiplataforma, por lo que podemos aprender a usar ImageMagick en un sistema operativo y podremos usarlo en cualquier otro sistema operativo con el que nos toque trabajar.
  • Es en modo consola, por lo que podemos hacer scripts que automaticen los procesos, así como bibliotecas o funciones que permiten reutilizar ese código y repetir automáticamente los efectos sobre tantas imágenes como queramos.
  • No necesita un entorno gráfico, por lo que nos ahorramos mucho tiempo en tareas rutinarias tediosas que sí que tienen los programas con entornos gráficos, como el tener que ir a Archivo / Abrir, tener que buscar la imagen, esperar a que cargue, aplicar las modificaciones, tener que ir de nuevo al menú Archivo / Guardar como... Con ImageMagick todo esto lo podemos hacer en una única línea de código, sin tener que levantar las manos del teclado, consiguiendo una mayor productividad en el mismo tiempo de trabajo, pero, sobre todo, que el trabajo sea divertido, ahorrándonos los procesos repetitivos y aburridos.
  • Trabaja con más de 200 formatos gráficos, desde los más usuales en mapa de bits, como PNG, JPG, como formatos nativos de programas determinados (XCF, PSD, PSB...), formatos de fotografía (RAW, TIFF...), vectoriales (SVG, MVG...), ficheros de vídeo (MOV, MPG, MP4...), ficheros PDF... hasta formatos que nunca habrás visto, pero que ahí están. 
  • Más de 20 espacios de color distintos: además de los clásicos sRGB, RGB, RGBA y CMYK, permite trabajar con HSB, HSL, Lab... ofreciendo muchas más posibilidades que la mayoría de programas de edición de imágenes. 
  • Permite trabajar independientemente con los canales. ImageMagick no sólo ofrece la posibilidad de trabajar con esos más de 20 espacios de color sino que permite trabajar individualmente con cada uno de los canales de cada espacio de color, tanto extrayendo el canal en cuestión como aplicando las modificaciones que deseemos únicamente a un canal, consiguiendo resultados mucho más precisos que trabajando con la imagen completa.
  • Permite cambiar de espacio de color (y por lo tanto, trabajar con los canales de ese espacio de color) sobre la misma imagen en la misma instrucción. Es decir, podemos indicar a ImageMagick que aplique, por ejemplo, unas modificaciones en la capa de luminosidade del espacio Lab, otras independientes al canal rojo en el espacio RGB, otros cambios distinso a la capa de saturación en un espacio HSB y que el resultado de esos cambios lo transforme a un espacio de color de escala de grises ¡todo en la misma instrucción!
  • Más de 60 modos distintos de combinar imágenes. A la hora de combinar imágenes o capas, ImageMagick ofrece la posibilidad de elegir entre más de 60 modos: sumar, restar, multiplicar, dividir, copiar canales, matiz, luminosidad... así hasta más de 60 modos distintos. 

Nota: cuando digo que IM trabaja con más de 200 formatos, más de 60 modos de composición o más de 20 espacios de color, no digo cifras concretas ya que podría cambiar de una versión a otra. Para más información de tu versión, escribe:
convert -list format
convert -list colorspace
convert -list compose

Comandos de ImageMagick

Como hemos visto antes, ImageMagick no es un único programa, sino que es una suite formada por varios comandos que cada uno nos ofrece unas posibilidades distintas:

Animate: muestra una secuencia de imágenes con la carencia que deseemos entre imagen e imagen, así como los efectos que queramos que muestre sin que afecte a la imagen. Ofrece la posibilidad de previsualizar secuencias sin tener que aplicar los cambios a los ficheros.

Uso básico:

animate *.png 

Display: muestra una imagen, así como los efectos que queramos que muestre sin que afecte a la imagen. Ofrece la posibilidad de previsualizar imágenes sin tener que aplicar los cambios a los ficheros.

Uso básico:

display imagen.png

Composite: superpone imágenes una encima de otra. Permite usar máscaras con las que definir la opacidad. 
Uso básico:
composite primerplano.png fondo.png imagencompuesta.png

Conjureejecuta scripts en msl (Magick Scripting Language), el lenguaje de scripts multiplataforma de ImageMagick.

Uso básico:

conjure script.msl

Convert: crea un nuevo fichero a partir de las modificaciones indicadas en los parámetros. Puede generar imágenes desde 0, como lienzos, imágenes con texto... o modificar imágenes sobre las que le idicamos las modificaciones a realizar. 

Uso básico:

convert origen.png -parametro valor destino.png

Display: muestra una imagen. Le podemos indicar parámetros de modificación de la imagen para que muestre una previsualización de una imagen sin tener que generar un fichero nuevo con los cambios ni aplicarlos sobre esa imagen. 

Uso básico:

display imagen.png

Identify: Muestra información sobre una imagen, como el tamaño, el nombre, el formato... podemos indicarle que nos de únicamente algún dato concreto, como el tamaño de una imagen, por ejemplo, para usar esos datos en nuestros scrpts. 

Uso básico:

identify imagen.png

Import: Captura pantallazos, tanto de la pantalla completa como de una única ventana o de una porcion de la pantalla. También puede capturar una serie pantallazos, le podemos indicar el tiempo entre captura y captura.

Uso básico:

import pantallazo.png

Mogrify: Modifica un fichero de imagen sin generar un nuevo fichero, es decir, aplica los cambios sobre el mismo fichero de origen.

Uso básico:

mogrify imagen.png -parametro valor

Montage: Crea un mosaico con las imágenes que le indiquemos, que puede ser una a una o una secuencia tipo *.png. Permite definir el espacio entre imágenes, el número de filas, de columnas...
Uso básico:

montage *.png mosaico.png

Leer más ...

Cambiar el tamaño del lienzo en ImageMagick. El parámetro extent

15 Agosto 2018 by 0 Comment Multimedia 2808 Views

Ya sabemos algunas formas de recortar una imagen con ImageMagick con el parámetro -crop:
Ajustar una imagen a un determinado tamaño
Cortar horizontal y verticalmente una imagen
Cortar horizontal o verticalmente una imagen
Pero, ¿y si queremos hacer más grande el lienzo? Para eso tenemos el parámetro -extent. Su uso básico es:

convert $origen -extent $anchoX$alto $destino

Con esta instrucción definimos el tamaño del fichero destino, sea este mayor o menor que el de la imagen origen. 

Cambiar el tamaño del lienzo por uno más pequeño

Veamos una imagen:
farola.jpg

Y queremos quedarnos únicamente con el escudo. Haremos un recorte de 200x150 pixeles. 
convert farola.jpg -extent 200x150 recorte.jpg
recorte.jpg
Ooooops... Queríamos un león y sólo se le ve un trozo de las garras. Esto ha pasado porque, al no definir la gravedad, ha tomado como referencia el punto 0x0. Así que, como lo que queríamos era la parte central de la imagen, lo definiremos con -gravity center:
convert farola.jpg -gravity center -extent 200x200 leon.jpg

leon.jpg

Hacer más grande el tamaño del lienzo




Como hemos visto, -extent permite cambiar el tamaño del lienzo, por lo que también podemos hacer el lienzo más grande. Vamos verlo:

convert leon.jpg -gravity center -extent 300x300 leonenmarcado.jpg

leonenmarcado.jpg

Ahora tenemos el león centrado en un lienzo blanco de 300x300 pixeles. 

Definir el color del lienzo

Por defecto, ImageMagick hace blanco el color del fondo, pero esto podemos cambiarlo. El parámetro es -background $color. 
Vamos a hacer otro lienzo de 300x300 píxeles, pero esta vez que sea negro:

convert leon.jpg -gravity center -background black -extent 300x300 leonenmarcadoennegro.jpg


leonenmarcadoennegro.jpg
Si en lugar de utilizar un color determinado lo que quisiéramos es un fondo transparente, por ejemplo para superponer a otra imagen, lo que haríamos es definir el color de fondo como "transparent"
convert leon.jpg -background Transparent -gravity center -extent 300x300 leonsobretransparente.png

leonsobretransparente.png

 

Nótese aquí que he estado utilizando todas las imágenes en formato jpg menos la última, que he puesto leonsobretransparente.png, ya que el formato png admite transparencias mientras que el jpg no admite transparencia. 

Leer más ...

La gravedad en ImageMagick: el parámetro -gravity

14 Agosto 2018 by 0 Comment Multimedia 2048 Views

En ImageMagick podemos usar once puntos de referencia a la hora de alinear elementos, hacer recortes, ajustar o cualquier otra acción que implique el uso de unas coordenadas. Estos son:

 

None -> Sin punto de gravedad. Toma como referencia orientativa la esquina superior izquierda a la hora de hacer un mapa de bits, pero como los dibujos vectoriales no tienen punto de gravedad es mejor usar esta opción cuando vamos a hacer una imagen vectorial. 
Center-> El centro. El punto resultante de calcular $anchura/2 x $altura/2
East-> Centro derecha. El punto resultante de calcular $anchura x $altura/2
Forget -> No hace uso del parámetro gravity, por lo que toma como referencia 0x0. 
NorthEast -> Esquina superior derecha. El punto $anchura x 0
North -> Centro superior. El punto $anchura/2 x 0
NorthWest -> Esquina superior izquierda. El punto 0 x 0
SouthEast -> Esquina inferior derecha. El punto $anchura x $altura
South -> Centro inferior. El punto $anchura/2 x $altura
SouthWest -> Esquina inferir izquierda. El punto $anchura x 0
West -> Centro izquiera. El punto $altura/2 x 0

Listar los puntos de gravedad

Para listar los puntos de gravedad, como con cualquier otro listado en ImageMagick, podemos usar el parámetro -list. En este caso:

convert -list gravity

None
Center
East
Forget
NorthEast
North
NorthWest
SouthEast
South
SouthWest
West

Ejemplo de uso

Vamos a ver un script que nos muestre cómo queda un cuadro pequeño sobre otro más grande, para que se vea bien, montado con composite e indicándole las distintas posibilidades de punto de gravedad de ImageMagick:

#!/bin/bash
convert -size 500x500 xc:red fondorojo.png
convert -size 50x50 xc:black cuadronegro.png
for i in $(convert -list gravity)
do
composite cuadronegro.png -gravity $i fondorojo.png $i.png
done

Que nos genera: 

None.png

None.png
Center.png

Center.png
East.png
East.png
Forget.png

Forget.png
NorthEast.png

NorthEast.png
North.png

North.png
NorthWest.png

NorthWest.png
SouthEast.png

SouthEast.png
South.png

South.png
SouthWest.png

SouthWest.png
West.png

West.png

Leer más ...

Superponer una imagen a otra en ImageMagick: composite

14 Agosto 2018 by 0 Comment Multimedia 3545 Views

Para superponer una imagen sobre otra en ImageMagick tenemos el comando composite que, en su uso más básico se utiliza:
composite $imagensuperior $imageninferior $imagendestino

Veamos una prueba sencilla:


convert -size 50x50 xc:blue cuadroazul.png

cuadroazul.png

convert -size 100x50 xc:red fondorojo.png
fondorojo.png

Con estos comandos hemos creado dos imágenes: una, llamada fondorojo.png que 100x50 pixeles y otra de mitad de tamaño, 50x50 llamada cuadroazul.png. Y para superponerlas, escribiremos:
composite cuadroazul.png fondorojo.png montajeazulsobrerojo.png
montajeazulsobrerojo.png



Leer más ...

El parámetro -crop de ImageMagick (III): dividir horizontal o verticalmente una imagen

12 Agosto 2018 by 3 Comment Multimedia 2234 Views

Ya hemos visto cómo dividir horizontal y verticalmente en partes iguales una imagen, pero, ¿y si queremos hacer la dividisión únicamente en un eje?

Se lo indicaremos a crop con el porcentaje seguido de x100% si queremos que los cortes sean verticales o con 100%x seguido del porcentaje si queremos que la división sea horizontal. Así:

convert $origen -crop 50%x100% $corteshorizontales
convert $origen -crop 100%x50% $cortesverticales

Veamos un ejemplo: supongamos que queremos desordenar aleatoriamente una imagen en 10 franjas verticales.

Para pasar de:

guarderia_calle_Reino.jpg

A esto (o parecido, porque al ser aleatorio, cada vez que ejecutemos el script nos generará una imagen distinta): 

guarderia_desordenada.jpg

Veamos el script:

 

 

#!/bin/bash

origen="guarderia_calle_Reino.jpg"
destino="guarderia_desordenada.jpg"
ordendeimagenes=""

convert $origen -crop 10%x100% temporales%d.jpg

numerosaleatorios=$(shuf -i 0-9)

for i in $(seq 1 10)
do
      posicion=$(echo $numerosaleatorios | cut -d " " -f $i)
      ordendeimagenes="temporales"$posicion".jpg "$ordendeimagenes
done

convert $ordendeimagenes +append $destino

Explicación del script

Como siempre, vamos a ver paso a paso qué hemos hecho en este script:

#!/bin/bash -> Para indicar el shell que queremos usar
Después, las variables que vamos a utilizar. No me cansaré de repetir que ser ordenados ayuda a mantener y mejorar nuestros scripts, así como que otras personas puedan adaptarlos a sus necesidades. 
convert $origen -crop 10%x100% temporales%d.jpg -> dividimos en recortes iguales de un tamaño del 10% horizontalmente y un 100% vertical de la imagen original 
numerosaleatorios=$(shuf -i 0-9) -> Creamos una variable que contenga una serie de números del 0 al 9 (indicamos el rango con -i 0-9) ordenados aleatoriamente (shuf desordena)
Después recorremos esa variable con un for que irá del 1 al 10 ya que cut empieza a contar desde el 1, mientras que las imágenes creadas con -crop empiezan en 0.
Con posicion=$(echo $numerosaleatorios | cut -d " " -f $i) recortamos el listado anterior indicando que las partes a recortar están separadas con un espacio en blanco (indicado con -d " ") y que cada vez que pasa por el for muestre la columna correspondiente (indicado con -f $i) recordando que cut comienza a contar por 1.
Concatenamos los nombres de los ficheros a unir con       ordendeimagenes="temporales"$posicion".jpg "$ordendeimagenes. Lo que hacemos es añadir a una cadena de texto que hemos inicializado al comienzo como una cadena vacía (ordendeimagenes="") los ficheros con el patrón fijo que hemos indicado al hacer el recorte ("temporales"), la posición de la imagen que hemos extraido de la cadena aleatoria ($posicion) y la extensión seguida de un espacio (".jpg ") para que entre los nombres de los ficheros haya un espacio en blanco que permita que al unirlos después, lo entienda como ficheros distintos. 
Y, por último, concatenamos esos ficheros horizontalmente con +append. (Para concatenarlos verticalmente sería con -append). 

Leer más ...

El parámetro -crop de ImageMagick (II): dividir imágenes en partes iguales

12 Agosto 2018 by 0 Comment Multimedia 3269 Views

A todos nos encantan las pantallas gigantes en los conciertos, en escaparates, en espectáculos y eventos de todo tipo... en general, en cualquier sitio donde vemos pantallas, nos quedamos mirándolas (por eso las ponen). Y si además, las imágenes cambian si interactuamos con la pantalla o con el entorno, nos gustan más todavía (por ejemplo, imágenes procesadas sobre la marcha con ImageMagick). Y cuanto más grandess sean, mejor. Tanto es así, que muchas veces se utilizan varias pantallas para mostar una imagen. 

Y si somos nosotros los que programamos la interacción con los usuarios, lo último que queremos es que se vea mal o que se descuadre la imagen al mostrarse en las pantallas. Así que vamos a ver cómo dividir una imagen para mostrar cada una de las partes en una pantalla distinta.

Usaremos una imagen cualquiera:

fuente_plaza_Emperador_Carlos.jpg

 

Y supongamos que queremos dividirla en cuatro imágenes iguales para cuatro pantallas distintas. ¿Cómo lo haremos? Cortando por la mitad horizontalmente y por la mitad verticalmente. Es decir, al 50% horizontalmente y al 50% verticalmente. Esto es muy importante, porque instintivamente podemos pensar en divididir al 25%. Pero esto nos haría cuatro cortes (100/25=4) horizontales y otros tantos cortes verticales, por lo que nos dejaría una imagen dividida en 16 partes (4x4 cortes). 
Vamos a comprobarlo:

convert fuente_plaza_Emperador_Carlos.jpg -crop 50% fuente_plaza_Emperador_Carlos%d.jpg

Explicación:

convert -> el comando de ImageMagick con el que trabajamos.
fuente_plaza_Emperador_Carlos.jpg -> El nombre de la imagen con la que vamos a trabajar. En este caso, como es una fuente que está en la Plaza del Emperador Carlos, la he llamado así. Si fuera una foto de mi prima bailando una jota, se llamaría mi_prima_bailando_una_jota.jpg. Pero no es el caso. 
-crop 50% -> Le indicamos a convert que corte por la mitad horizontalmente y por la mitad verticalmente. Podemos usar también -crop 50%x50% pero como el valor es el mismo para el corte horizontal y el vertical, nos podemos ahorrar unos caracteres indicando sólo una vez el porcentaje. 
fuente_plaza_Emperador_Carlos%d.jpg -> Cómo queremos que se llamen los ficheros generados. Le indicamos tres patrones:

  • fuente_plaza_Emperador_Carlos -> el nombre de todas las imágenes generadas a través de esta instrucción comenzará con la cadena "fuente_plaza_Emperador_Carlos"
  • %d -> después de la primera cadena que será igual para todos los ficheros, cada uno llevará un número correlativo desde 0 y que irá aumentando de izquierda a derecha. Es decir:
    • 0.- Recorte superior izquierdo
    • 1.- Recorte superior derecho
    • 2.- Recorte inferior izquierdo
    • 3.- Recorte inferior derecho
  • .jpg -> Las imágenes generadas tendrán la extensión .jpg

Veamos el resultado:

fuente_plaza_Emperador_Carlos0.jpg: 

fuente_plaza_Emperador_Carlos0.jpg
fuente_plaza_Emperador_Carlos1.jpg: fuente_plaza_Emperador_Carlos1.jpg
fuente_plaza_Emperador_Carlos2.jpg fuente_plaza_Emperador_Carlos2.jpg
fuente_plaza_Emperador_Carlos3.jpg fuente_plaza_Emperador_Carlos3.jpg
Y, ya que estamos troceando imágenes, vamos a ver cómo quedaría si hubiera tenido la tentación de escribir 25%:

convert fuente_plaza_Emperador_Carlos.jpg -crop 25% fuente_plaza_Emperador_Carlos%d.jpg

fuente_plaza_Emperador_Carlos0.jpg:
_fuente_plaza_Emperador_Carlos0.jpg
fuente_plaza_Emperador_Carlos1.jpg:
_fuente_plaza_Emperador_Carlos1.jpg
fuente_plaza_Emperador_Carlos2.jpg:
_fuente_plaza_Emperador_Carlos2.jpg
fuente_plaza_Emperador_Carlos3.jpg:
_fuente_plaza_Emperador_Carlos3.jpg
fuente_plaza_Emperador_Carlos4.jpg: fuente_plaza_Emperador_Carlos4.jpg fuente_plaza_Emperador_Carlos5.jpg: fuente_plaza_Emperador_Carlos5.jpg fuente_plaza_Emperador_Carlos6.jpg: fuente_plaza_Emperador_Carlos6.jpg fuente_plaza_Emperador_Carlos7.jpg: fuente_plaza_Emperador_Carlos7.jpg fuente_plaza_Emperador_Carlos8.jpg: fuente_plaza_Emperador_Carlos8.jpg fuente_plaza_Emperador_Carlos9.jpg: fuente_plaza_Emperador_Carlos9.jpg fuente_plaza_Emperador_Carlos10.jpg: fuente_plaza_Emperador_Carlos10.jpg fuente_plaza_Emperador_Carlos11.jpg: fuente_plaza_Emperador_Carlos11.jpg fuente_plaza_Emperador_Carlos12.jpg: fuente_plaza_Emperador_Carlos12.jpg fuente_plaza_Emperador_Carlos13.jpg: fuente_plaza_Emperador_Carlos13.jpg fuente_plaza_Emperador_Carlos14.jpg: fuente_plaza_Emperador_Carlos14.jpg fuente_plaza_Emperador_Carlos15.jpg: fuente_plaza_Emperador_Carlos15.jpg

Leer más ...

El parámetro -crop de ImageMagick (I): ajustar imágenes

11 Agosto 2018 by 0 Comment Multimedia 2905 Views

Cada vez las cámaras fotografían con mayor resolución, incluso con resoluciones mayores a las pantallas en las que vemos esa imagen. Y esto nos da mucho juego para poder manipular las imágenes haciendo recortes que nos permitan, entre otras cosas:


Ajustar la fotografía a aquello que queremos mostrar, quitando todo lo que sobra alrededor 

Veamos esta fotografía de la escultura de Miguel Servet en la antigua facultad de medicina de Zaragoza:

servet.jpg

Si queremos mostrar únicamente la escultura, sobra imagen por todos los lados. Avuelapluma y sin ajustar demasiado (estamos hablando de ImageMagick, no de armonía, ni de composición), pienso que podemos quitar 1/7 por arriba y por abajo y alrededor de 1/5 a izquierda y derecha, así que, como ya sabemos cómo preguntarle a ImageMagick el tamaño de las imágenes, voy a hacer esos recortes:

#!/bin/bash
origen="servet.jpg"
destino="servet_recortado.jpg"
let anchura=$(identify -format %w $origen) 
let altura=$(identify -format %h $origen)
let anchurarecorte=$anchura/5
let alturarecorte=$altura/7
let nuevaanchura=$anchurarecorte*3
let nuevaaltura=$alturarecorte*5
recorte=$nuevaanchura"x"$nuevaaltura"+"$anchurarecorte"+"$alturarecorte
convert $origen -crop $recorte $destino

Veamos lo que he hecho en este script: 

Primero, indicarle que estamos escribiendo un script en Bash con #!/bin/bash
E indicarle cual es la imagen que vamos a procesar y cómo queremos que se guarde la imagen modificada, Aunque esta sea una operación sencilla, siempre viene bien ser ordenados y definir primero las variables con las que vamos a trabajar y acostumbrarnos a nombrar con variables. Poco a poco iremos haciendo más complejos los scripts y cuando empecemos a hacer animaciones con ImageMagick viene muy bien ser estructurados.
El siguiente paso ha sido preguntarle a ImageMagick la altura y la anchura de la imagen para poder calcular dos cosas: Las partes a recortar, tanto horizontal como verticalmente (ese 1/7 y 1/5 que hemos dicho antes) y el tamaño de la imagen resultante. En este caso, como le quitábamos 1/7 por arriba y por abajo serían 7-1-1=5 -> 5/7 de la imagen y como le recortamos 1/5 a izquierda y otro 1/5 a la derecha, nos quedaría 5-1-1=3 -> 3/5 partes de la imagen. 
Una variable que contiene primero la anchura expresada en anchuraxaltura y después el recorte que le hacemos por arriba y por la izquiera expresado en +recortehorizontal+recortevertical.
Cuando tenemos todos los valores calculados, ejecutamos la instrucción diciéndole a convert que recorte con -crop y cómo queremos que sea el recorte. 

Al final, la imagen resultante ha quedado así:

server_recortado.jpg

Leer más ...

Saber la altura y anchura de una imagen con ImageMagick

11 Agosto 2018 by 1 Comment Multimedia 3931 Views

¿Necesitas saber el tamaño de una imagen para poder trabajar con ella, ajustarla a un tamaño determinado, ampliarla, reducirla o recortarla? ImageMagick te lo dice con el comando identify y el parámetro -format. Para saber el tamaño, trabajaremos con dos modificadores: 

identify -format %w -> Nos inidca la anchura
identify -format %h -> Nos indica la altura

En consola

identify -format %w imagen.png

identify -format %h imagen.png

Devuelve la anchura y la altura respectivamente, de la imagen contenida en imagen.png

En script

Si queremos sacarle más partido y pasarle esos valores a una variable numérica:

let anchura=$(identify -format %w imagen.png) 
let altura=$(identify -format %h imagen.png)

Con esto, ya podremos operar con los valores de las variables $anchura y $altura.

Leer más ...

Los colores predefinidos en ImageMagick

02 Agosto 2018 by 3 Comment Multimedia 2106 Views

ImageMagick cuenta con una serie de colores predefinidos a los que podemos llamar por su nombre en lugar de por su código hexadecimal. Es más cómodo invocarlos por su nombre, aunque es más preciso hacerlo por su código. Así que cada uno que elija lo que más le interese, aunque en este artículo nos vamos a centrar en los colores preestablecidos y cómo sacarle partido a este listado. 

Saber los colores predefinidos con los que podemos trabajar

Para poder listar en ImageMagick está el parámetro -list. 

convert -list $listaamostrar

Nos mostrará la lista que le pidamos. En este caso, le pediremos que liste los colores:

convert -list color

Y nos mostrará el listado de colores. En mi caso:

$ convert -list color | wc -l$ convert -list color | wc -l
683

Me dice que tengo 683 colores predefinidos. Con wc -l le he pedido que me diga únicamente las líneas del listado, no el listado en sí, y así sé el número de colores que tengo. 

Saber los tonos de un determinado color

Si quiero saber los distintos colores predefinidos basados en un determinado color, lo que puedo hacer es redirigir la salida del listado a un grep e indicarle el patrón. Veamos cómo listar las tonalidades de rojo que tengo:

convert -list color | grep Redconvert -list color | grep Red
DarkRed               srgb(139,0,0)                                 SVG X11 
IndianRed             srgb(205,92,92)                               SVG X11 XPM 
IndianRed1            srgb(255,106,106)                             X11 
IndianRed2            srgb(238,99,99)                               X11 
IndianRed3            srgb(205,85,85)                               X11 
IndianRed4            srgb(139,58,58)                               X11 
MediumVioletRed       srgb(199,21,133)                              SVG X11 XPM 
OrangeRed             srgb(255,69,0)                                SVG X11 XPM 
OrangeRed1            srgb(255,69,0)                                X11 
OrangeRed2            srgb(238,64,0)                                X11 
OrangeRed3            srgb(205,55,0)                                X11 
OrangeRed4            srgb(139,37,0)                                X11 
PaleVioletRed         srgb(219,112,147)                             SVG X11 XPM 
PaleVioletRed1        srgb(255,130,171)                             X11 
PaleVioletRed2        srgb(238,121,159)                             X11 
PaleVioletRed3        srgb(205,104,137)                             X11 
PaleVioletRed4        srgb(139,71,93)                               X11 
VioletRed             srgb(208,32,144)                              X11 XPM 
VioletRed1            srgb(255,62,150)                              X11 
VioletRed2            srgb(238,58,140)                              X11 
VioletRed3            srgb(205,50,120)                              X11 
VioletRed4            srgb(139,34,82)                               X11

Pero vemos que esto es un listado con tres columnas y que me da más información que la que voy a usar a la hora de invocar un color, ya que para esto, utilizaré únicamente el nombre. Así que limpiaré el listado y me quedaré con la primera columna que es la que me interesa: 

convert -list color | grep Red | cut -f 1 -d " "
DarkRed
IndianRed
IndianRed1
IndianRed2
IndianRed3
IndianRed4
MediumVioletRed
OrangeRed
OrangeRed1
OrangeRed2
OrangeRed3
OrangeRed4
PaleVioletRed
PaleVioletRed1
PaleVioletRed2
PaleVioletRed3
PaleVioletRed4
VioletRed
VioletRed1
VioletRed2
VioletRed3
VioletRed4

Así ya podemos ver el listado limpio y podemos trabajar con esos valores

Recorrer el listado de colores

En muchas ocasiones nos interesa utilizar distintos tonos de un color, por ejemplo, para dar ir cambiando la tonalidad de una imagen. Para ello, una vez que tenemos el listado limpio, únicamente tenemos que recorrerlo con un for:


function hazlienzosdecolor()

{
     for i in $(convert -list color | grep Red | cut -f 1 -d " ")
     do
          #Instrucciones
     done
}

Supongamos que queremos hacer una serie de lienzos de un tamaño determinado basados en un color que le pasemos como parámetro. Podríamos hacer un script como este:

 

 

#!/bin/bash

tamlienzo="200x100"
let numlienzo=0

function hazlienzosdecolor()
{
     if [ $1 ] && [ "$(convert -list color | grep $1 | cut -f 1 -d " ")" ]
     then
          for i in $(convert -list color | grep $1 | cut -f 1 -d " ")
          do
               destino="lienzo"$1$numlienzo".png"
               convert -size $tamlienzo xc:$i $destino
               let numlienzo++
           done
      fi
}

hazlienzosdecolor $1

Y al ejecutarlo, genera:

./hazlienzosdecolor Orange

lienzoOrange0.pnglienzoOrange9.pnglienzoOrange8.pnglienzoOrange7.pnglienzoOrange6.pnglienzoOrange5.pnglienzoOrange4.pnglienzoOrange3.pnglienzoOrange2.pnglienzoOrange1.png

 

Qué hemos hecho en este script:

Primero indicamos las variables, de esta forma, si queremos modificarlas en cualquier momento, las tenemos localizadas a simple vista

Después le decimos que si al ejecutarse el script recibe un parámetro ([ $1 ]), y además (&&) este es un color válido ([ "$(convert -list color | grep $1 | cut -f 1 -d " ")" ]) ejecute estas órdenes:

for i in $(convert -list color | grep $1 | cut -f 1 -d " ")-> Recorre el listado de los colores que contengan el valor indicado en el primer parámetro y únicamente el primer campo del listado

destino="lienzo"$1$numlienzo".png" -> Da valor a la variable destino con una cadena de texto, en este caso el patrón "lienzo", luego el nombre el color que ha indicado el usuario, el número que corresponde a ese lienzo y la extensión ".png"

convert -size $tamlienzo xc:$i $destino -> Genera el lienzo

let numlienzo++ -> Suma uno a la variable numlienzo para que el siguiente lienzo a crear tenga el próximo número correlativo.

Seleccionar un color de forma aleatoria

Para seleccionar un color aleatorio, no le indicaremos un patrón (quitamos el grep $1) y lo que tenemos que indicarle al listado generado es que lo desordene y muestre sólo un color, que se lo indicaremos con shuf -n 1:
convert -list color | cut -f 1 -d " " | shuf -n 1

Y si lo queremos usar en un script para que una variable recoja ese color aleatorio, podemos hacer:

  

#!/bin/bash

function coloraleatorio()
{
          color=$(convert -list color | cut -f 1 -d " " | shuf -n 1)
          echo $color
}

color=$(coloraleatorio)

echo $color

Puede parecer excesivo hacer una función para algo tan sencillo, pero cuando estás generando muchos colores aleatorios al cabo del día, se agradece tener funciones creadas ;)

Leer más ...
Página 3 de 3

¡Atención! Este sitio usa cookies y tecnologías similares.

Si no cambia la configuración de su navegador, usted acepta su uso. Saber más

Acepto

Vea nuestra política de cookies y enlaces de interés aquí