Archivo

Archivo para Septiembre, 2010

Comentarios en el código fuente

Domingo, 19 de Septiembre de 2010 Gaspar Fernández 2 comentarios

Leo en Stack Overflow los mejores comentarios que se han encontrado muchos desarrolladores en el código fuente. Merece la pena leerlos, y echar un ratillo. Advertencia… está en inglés.

Podemos encontrar muchísimas disculpas, y es cierto que muchas veces recurrimos a soluciones rápidas, ininteligibles para los demás humanos, no demasiado optimizadas y mucho menos elegantes, pero que nos hacen el apaño.

También encontramos algunos como:

1
return 1; # returns 1
1
long long ago; /* in a galaxy far far away */
1
double penetration; // ouch
1
return 0; // Happy ending
1
2
// Added because boss changed his mind : 20020111,20020501,20020820, ...
// Commented out because boss changed his mind : 20020201,20020614,20020908, ...
1
// This code worked before, but my cat decided to take a trip across my keyboard...
1
2
// Since today's CPUs are really fast, this is dedicated to those who said:
// " You can't use Moore's Law as an excuse to write bad software. "

Bueno… y mucho más…

Vídeo digital: Secuencias de imágenes

Jueves, 16 de Septiembre de 2010 Gaspar Fernández Sin comentarios

Esta vez voy a presentar algunos ejemplos de uso de ffmpeg con secuencias de imágenes. Para empezar a trabajar con vídeo digital desde GNU/Linux.

Crear vídeo a partir de una secuencia de imágenes

Es una buena técnica el hecho de trabajar con secuencias de imágenes para crear un vídeo. Podemos, por ejemplo utilizar la potencia de Imagemagick (I, II, III, IV) para modificar el color de la imagen, etiquetarlas o darle algún tratamiento. O incluso para manejar transparencias en vídeo de una forma controlada. Para las secuencias de imágenes es conveniente utilizar un formato de imagen sin pérdidas como png, pnm, o jpg sin pérdidas (ojo, no jpg normal).

Para hacer la conversión podemos utilizar esta orden:

$ ffmpeg -f image2 -i directorio/imag%d.png -r 25 -vcodec mpeg4 video.avi

Elegimos como entrada un formato de imágenes y las exportaremos a 25 fps, con el codec mpeg4 y el archivo se llamará video.avi. Todas las imágenes estarán dentro de directorio y se llamarán imag0.png, imag1.png, imag2.png, …

Siempre depende el codec que vayamos a utilizar, si queremos enviarlo por Internet, o grabarlo en algún soporte como montaje definitivo podemos utilizar el formato mpeg4, theora, h264, vp8, etc; si queremos grabarlo en DVD podemos escoger mpeg2, aunque si vamos a utilizarlo como parte de nuestro proceso de montaje podemos usar dv o algún codec sin pérdidas como ljpeg, jpegls, v210, etc; el objetivo, para montaje es utilizar un formato sin comprimir o comprimido sin pérdidas.

Creando un vídeo sólo con una imagen

En ocasiones, puede ser necesario crear un archivo de vídeo que sólo contenga una imagen. ¿ Por qué ? Podemos crear algún script que haga algún efecto con ese vídeo, una transición, o podemos unirlo a un vídeo, para hacer de cortinilla de inicio o cierre.

Para ello hacemos lo siguiente:

$ ffmpeg -loop_input -f image2 -i imagen.png -vframes 50 -r 10 -vcodec libtheora video.avi

Donde grabaremos 50 frames con la imagen imagen.png a 10 fotogramas por segundo y con el codec theora. Aunque, en lugar de especificar los fps podemos especificar el tiempo que queremos que dure (en hh:mm:ss.[xxx], es decir, horas, minutos, seguntos, centésimas):

$ ffmpeg -loop_input -f image2 -i imagen.png -t 00:00:5.50 -r 10 -vcodec libtheora video.avi

Donde grabaremos un vídeo de 5 segundos y medio con la misma imagen.

Pasando un vídeo a secuencia de imágenes

Ahora tratamos de hacer la primera conversión, de vídeo a imágenes, intentando escoger el codec adecuado. Aunque podemos utilizar jpg, vamos a exportar a png para dar más calidad a las imágenes:

$ ffmpeg -i video.avi -f image2 -vcodec png video/frame_%d.png

Grabaremos los distintos fotogramas del video (video.avi) en el directorio video y con archivos llamados frame_1.png, frame_2.png, frame_3.png…

Jugando con ImageMagick (IV): Automatizando procesos, creando animaciones

Martes, 14 de Septiembre de 2010 Gaspar Fernández 3 comentarios

El cuarto post de la serie, anteriormente hablábamos de:

  1. Dimensiones, Captura, Color y Efectos
  2. Color (continuación) y Rotación
  3. Jugando con ImageMagick (III): Colecciones, texto, y unión de efectos

Ya que estamos hartos de ver lo que es capaz de hacer ImageMagick, ahora mezclemos esto con la potencia de la consola, y tendremos una de las herramientas más potentes jamás inventadas en cuanto a imagen digital se refiere.

Modificando imágenes en un directorio

Aunque podremos hacer cualquier tipo de modificación, tal y como hemos visto anteriormente, haremos un ejemplo en el que redimensionaremos todos los archivos de un directorio al 50% (muy útil si preparamos en un directorio muchos archivos directamente de una cámara digital para subir a Internet):

$ mogrify -resize 50% directorio/*

Con mogrify podemos hacer lo mismo que con convert, sólo que el fichero de origen y de destino es el mismo.

Aunque… ¿y si queremos guardar los archivos originales? Tendremos que hacer un pequeño script para convertir los archivos de un directorio y guardarlos en otro direcorio diferente; pero… y si son muchos ? Tenemos algunas posibilidades:

$ for f in test/*.jpg; do convert -monitor -resize 50% $f “test2/”${f##*/}; done

Si tenemos todos los archivos en el directorio test, queremos redimensionar al 50% y guardarlos en test2/ con el mismo nombre que tienen. ${f##*/} elimina el directorio del nombre del archivo, es lo mismo que la orden basename. Y con el parámetro -monitor veremos más o menos lo que está haciendo convert en cada momento.

Aunque, tal vez queramos un indicador de progreso para saber más o menos cuánto queda y cuántos archivos llevamos, lo podemos hacer con bc y Xdialog:

1
2
3
4
5
6
7
8
9
archivos=`ls test/*.jpg`;
total=`echo $archivos | wc -w`;
hecho=0;
for f in $archivos;
do
convert -resize 50% $f "test2/"${f##*/};
let hecho=$hecho+1;
echo "scale=0;$hecho*100/$total"|bc;
done | Xdialog --gauge "Progreso..." 10 100 0

En este ejemplo, separamos en variables los archivos a tratar y contamos el total de archivos a procesar. La variable hecho contará cuántos archivos ha convertido hasta el momento.

Luego en el bucle principal convertiremos los archivos e iremos incrementando la variable hecho en 1. Más adelante, con la ayuda de bc calculamos el porcentaje hecho. El bucle lo pasamos con una pipe a Xdialog, con su opción de gauge con lo que iremos indicando el proceso a medida que se vayan convirtiendo archivos.

Añadiendo un texto a todas las imágenes

Podemos, además, añadir un texto a todas las imágenes con un formato determinado para incluir el nombre de fichero, ancho, alto, la etiqueta de fichero, etc:

$ mogrify -gravity South -pointsize 20 -fill black -annotate ‘%f %b bytes” *

Con lo que anotaremos dentro de la imagen en color negro el nombre del archivo y el tamaño en bytes. Para esto tenemos algunas palabras clave como %f y %b en este enlace: Imagemagick.org (Identify -format).

hamburguesonAunque tal vez queramos poner un texto diferente a cada foto. Imaginemos que tenemos muchos ficheros jpg y muchos ficheros txt. Los ficheros txt tienen el mismo nombre que los jpg y sólo varía la extensión; y queremos plasmar el texto de los txt en los ficheros jpg:

1
2
3
4
5
6
7
8
9
10
11
for f in *.jpg;
do
if [ -r ${f%.*}.txt ];
then
txt=`cat ${f%.*}.txt`;
else
txt="Mis guisos 2010";
fi;
echo $txt en $f;
mogrify -gravity North -pointsize 15 -fill white -annotate 0x0+10+10 "$txt" $f;
done

Esta vez, si encontramos el fichero de texto con el mismo nombre que la imagen, solo que con extension txt escribiremos ese texto en la parte superior de la imagen; pero si no, escribiremos “Mis guisos 2010″ y así recorriendo todos los archivos jpg del directorio.

Una animación sencilla

destinVamos a crear una transición entre dos imágenes. Y para el ejemplo, hemos utilizado estas dos imágenes:

$ convert -size 720×576 xc:black -gravity Center -fill white -pointsize 250 -font impact -draw ‘text 0 0 A’ a.jpg

$ convert -size 720×576 xc:black -gravity Center -fill white -pointsize 250 -font impact -draw ‘text 0 0 B’ b.jpg

Para realizar el fundido hacemos lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
n_imgs=30; # Número de imágenes
s=`echo "scale=2;100/$n_imgs" | bc` # Porcentaje de inremento de cada paso.
o=0;   # Visibilidad de la imagen B
d=100; # Visibilidad de la imagen A
f=0;   # Fotograma actual
while (( $f < 20 ));
do
convert -compose blend -set "option:compose:args" $o,$d a.jpg b.jpg -composite dest/anim_$f.jpg;
o=`echo "scale=2;$o+$s" | bc`;
d=`echo "scale=2;$d-$s" | bc`;
f=$(($f+1));
echo "Frame: $f O=$o D=$d";
done

Con esto se creará la secuencia de $n_imgs (que al principio le damos valor 30) imágenes en el directorio dest/; todas empezando por anim_.

Si queremos crear un gif animado con esto, podemos hacer lo siguiente:

$ convert dest/anim_{0..29}.jpg trans.gif

La pesadilla de cambiarse a Windows

Lunes, 13 de Septiembre de 2010 Gaspar Fernández Sin comentarios

No suelo hacer un post sólo para enlazar un artículo, pero este me ha parecido interesante.

Y es que muchos vez un cambio a Linux como algo oscuro y siniestro, pero hay personas que consideramos el cambio a Windows como algo tremendamente difícil.

La pesadilla de cambiarse a Windows - Paraíso Linux

Personalmente, ¿ por qué uso Linux ?

  • Me hace más productivo
  • Me da más sensación de seguridad
  • Me permite hacer más cosas
  • Me gusta aprender algo cada día

Todo va mucho más allá de la filosofía del software libre.

Compilando y linkando a mano con GCC

Sábado, 11 de Septiembre de 2010 Gaspar Fernández Sin comentarios

GCC compila y linka automáticamente, nos devuelve un ejecutable directamente:

$ gcc -o ejecutable fuente.c

pero en realidad, aparte de pre-procesar y compilar, enlaza algunas bibliotecas del sistema para que nuestro ejecutable funcione bien. Sólo por jugar un poco, veamos, más o menos (depende del sistema) cómo obtener el ejecutable a mano, es decir, compilamos por un lado, y linkamos por otro.

Primero, creamos un programa sencillo, un hello.c que contenga lo siguiente:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(int argc, char *argv[])
{
   printf("Hola mundo!!\n");

   return 0;
}

Ahora obtenemos el fichero objeto, nuestro código compilado de la siguiente manera:

$ gcc -c hello.c

Veremos que se ha generado el fichero hello.o ; éste fichero aún no lo podremos ejecutar, ya que no tenemos las librerías del sistema necesarias para ello.

Ahora obtendremos el fichero ejecutable con el linkador:

ld -o hello -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.2.3/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.2.3 hello.o /usr/lib/gcc/i686-pc-linux-gnu/4.2.3/crtend.o /usr/lib/crtn.o -lc

Debemos cambiar /usr/lib/gcc/i686-pc-linux-gnu/4.2.3 por la ruta correspondiente en nuestro equipo; los archivos necesarios se encontrarán en en el directorio de GCC, tras seleccionar la arquitectura y SO correspondiente (en mi caso i686-pc-linux-gnu), y dentro de ese directorio encontraremos otro correspondiente a la versión de GCC (en mi caso la 4.2.3).

Más o menos lo que vemos en el proceso de linkado es lo siguiente:

  • -o hello : es el nombre del ejecutable
  • -m elf_i386 : es el tipo de ejecutable y la arquitectura. También puede ser elf_x86_64 si tenemos las bibliotecas necesarias.
  • -dynamic-linker /lib/ld-linux.so.2: es el cargador dinámico
  • /usr/lib/crt1.o /usr/lib/crti.o: son dos objetos encargados de la inicialización de memoria del programa
  • /usr/lib/gcc/i686-pc-linux-gnu/4.2.3/crtbegin.o : indica cómo tiene que empezar el programa.
  • /usr/lib/gcc/i686-pc-linux-gnu/4.2.3/crtend.o : indica cómo tiene que terminar el programa
  • hello.o : es el objeto de nuestro programa.
  • -L/usr/lib/gcc/i686-pc-linux-gnu/4.2.3 : hacemos que el linkador busque bibliotecas en el directorio indicado.
  • /usr/lib/crtn.o : realiza tareas de limpieza de memoria.
  • -lc: incluye la librería de C estándar.

Los archivos que empiezan por crt* normalmente se encargan de poner los datos que nos entran en su sitio; parece que el hecho de coger los parámetros que nos pasan por la línea de comandos y colocarlos en memoria para que nuestro programa los lea es tarea fácil, y que luego nuestro programa devuelva una respuesta; y además, los programas no se ejecutan siempre en la misma posición de memoria, depende de la memoria que haya libre, eso lo suele controlar el S.O. pero nuestros ejecutables tienen que estar preparados… en definitiva, hay muchos agentes involucrados.

Una vez hecho esto, tenemos nuestro hola mundo preparado para ser ejecutado.

Debo agradecer a Carlos, que me dio la idea de escribir este artículo.

Tecla rápida para compilar con Kate

Jueves, 9 de Septiembre de 2010 Gaspar Fernández 2 comentarios

Aunque tenemos a nuestra disposición gran cantidad de IDEs para programación, a veces viene bien un programa muy rápido y que tenga capacidad para compilar y ejecutar pequeños programas.

Aunque tenemos la posibilidad de cargar una consola integrada, pero no es suficiente.

confkateNos dirigimos a la configuración del programa…

captElegimos herramientas externas y escogemos Nuevo, para crear una nueva herramienta. Ahí encontraremos la siguiente ventana:

capt1Rellenamos los campos y en script escribimos lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xterm -name xt2 -e sh -c 'cd "%directory";
fichero="%filename";
ejecutable=${CF%.*};
extension=${CF#*.};
extension=`echo $extension | awk '
\''{print tolower($0)}'\''`;

rm $ejecutable 2&gt; /dev/null;
case $extension in
"c") gcc -o $ejecutable "%filename" 1&gt;&amp;2 2&gt;/tmp/ktc_err
;;
"cpp") g++ -o $ejecutable "%filename" 1&gt;&amp;2 2&gt;/tmp/ktc_err
;;
*) echo "Extensión no reconocida" ;;
esac
./ejecutable
echo -e "\n-----------------";
echo "Compilación: ";
cat /tmp/ktc_err;
echo -e "--------------------\n";

printf "%s" "Pulsa INTRO para continuar"; read intro'

Este script básicamente compilará el programa actual ya sea en c o c++ dependiendo de la extensión y lo ejecutará, al mismo tiempo veremos un pequeño informe de la compilación al final de la ejecución.

Ahora, vamos a establecer una tecla rápida para la acción, para ello, guardamos el script que hemos hecho y aceptamos la ventana de opciones. Ahora vamos a Preferencias > Configurar accesos rápidos  y buscamos nuestra acción externa Compilar y Ejecutar:

capt2Personalizamos el acceso rápido de acción y establecemos una nueva tecla rápida y aceptamos. En mi caso elegí Control+F9 que tienen algunos IDEs.

Actualización: Si en lugar de Kate eres usuario de gedit, puedes dirigirte a este post.

Jugando con ImageMagick (III): Colecciones, texto, y unión de efectos

Lunes, 6 de Septiembre de 2010 Gaspar Fernández Sin comentarios

El tercer post de la serie, anteriormente hablábamos de:

  1. Dimensiones, Captura, Color y Efectos
  2. Color (continuación) y Rotación

Juntando imágenes en una sola

Ahora, la cosa se anima, veremos cómo recopilar varias imágenes en el mismo archivo de imagen; habréis visto algún ejemplo en la entrega II, en los que muestro varias imágenes juntas:

variasPara ello usamos montage:

$ montage -tile 4×2 -geometry 200×160+1+0 taza1.jpg taza2.jpg taza3.jpg taza4.jpg hamburgueson1.jpg hamburgueson2.jpg hamburgueson3.jpg hamburgueson4.jpg varias.jpg

Donde, con el parámetro tile, especificamos la agrupación de las imágenes ancho x alto (4×2 en este caso) y con geometry, el tamaño de cada imagen 200×160 de máximo, con una separación de 1 pixel a los lados y ninguno verticalmente.

La imagen conserva su aspecto, pero de alto ocupa 160 pixels por lo que existe una pequeña separación.

Añadiendo texto

outSin imagen original, simplemente un texto en un archivo de imagen. Obtenido de la siguiente forma:

$ convert -background black -fill red -gravity center -font Verdana -pointsize 20 -size 200×80 caption:’Rojo sobre negro’ rojosobrenegro.png

Donde:

  • -background especifica el color de fondo
  • -fill especifica el color de primer plano
  • -gravity es la alineación, centrada, tanto horizontal como verticalmente.
  • -font indica el tipo de letra
  • -pointsize indica el tamaño de la letra
  • -size indica el tamaño de la imagen (porque no vamos a utilizar ninguna imagen de origen).
  • caption:’Texto’ con ello indicamos el texto

out1

$ convert -size 300×120 xc:rgb\(50,50,70\) -fill rgb\(90,150,200\) -gravity SouthEast -font helvetica -pointsize 25 -draw ‘text 10 2 “Poesía Binaria”‘ poesia_binaria.jpg

Donde incluimos el texto en una determinada posición: 10×2 desde la esquina inferior derecha (SouthEast), tipo de letra helvetica y tamaño 25; de fondo (50,50,70) y de color (90,150,200).

out2Ahora, aprovecharemos un poco más las capacidades de la orden draw. Para ello, dibujaremos un cuadro en negro dentro de la imagen (antena.jpg de dimensiones 314×300) a modo de marco (verde); luego trazaremos una línea horizontal de color blanco (rojo) en el borde del cuadro que acabamos de dibujar y tras ello escribiremos un texto (azul).

$ convert antena_2.jpg -gravity SouthEast -font helvetica -pointsize 25 -fill black -draw ‘rectangle 0,270 314,300′ -fill white -draw ‘line 0,270 314,270′ -draw ‘text 13 1 “Mi antena Wifi”‘ out.jpg

out3Ahora introduciremos el texto directamente en la imagen, pero para facilitar la lectura incluiremos una sobra en el texto.

$ convert antena_2.jpg -gravity North -font helvetica -pointsize 25 -fill black -draw ‘text 0 0 “Mi antena Wifi”‘ -fill white -draw ‘text 1 1 “Mi antena Wifi”‘ out.jpg

Podemos incluir de forma opcional -blur 1×1 (por ejemplo) para difumirar el texto que hace de sombra y suavizarla.

Juntando los efectos disponibles

Uno de los mejores ejemplos es el siguiente: http://www.imagemagick.org/Usage/thumbnails/ aunque encontramos cientos de webs con efectos preparados para ImageMagick:

Ordenación en PHP. Ordenar provincias, pero Madrid y Barcelona ponerlas primero.

Sábado, 4 de Septiembre de 2010 Gaspar Fernández Sin comentarios

En el desarrollo del registro de una página web para España, es normal que la mayoría de las personas vengan de Madrid, Barcelona, Valencia o Sevilla (las provincias podemos cambiarlas).

El algoritmo para ello, en PHP es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
$provincias = array ("Almería",   "Cádiz",       "Córdoba",  "Granada",     "Huelva",     "Jaén",           "Málaga",
"Huesca",    "Teruel",      "Zaragoza", "Asturias",    "Cantabria",  "Sevilla",        "Zamora",
"Ávila",     "Burgos",      "León",     "Palencia",    "Salamanca",  "Segovia",        "Soria",
"Albacete",  "Ciudad Real", "Cuenca",   "Guadalajara", "Toledo",
"Barcelona", "Girona",      "Lleida",   "Tarragona",   "Alicante",   "Castellón",      "Valencia",
"Badajoz",   "Cáceres",     "A Coruña", "Lugo",        "Ourense",    "Pontevedra",     "La Rioja",
"Murcia",    "Navarra",     "Álava",    "Guipúzcoa",   "Vizcaya",    "Islas Baleares", "Las Palmas",
"Santa Cruz de Tenerife",   "Ceuta",    "Melilla",     "Valladolid", "Madrid");

function ordena_provincias ($a, $b)
{
static $primeras = array ("Madrid", "Barcelona", "Valencia", "Sevilla");

$iaa = in_array($a, $primeras);
$iab = in_array($b, $primeras);

/* Si las dos provincias están en el array $primeras miramos en qué posición están */
if ( ($iaa) &amp;&amp; ($iab) )
{
$iaa = array_search($a, $primeras);
$iab = array_search($b, $primeras);

return ($iaa<$iab)?-1:1;
}
/* Si sólo está $a en el array $a va primero */
elseif ($iaa)
return -1;
/* Si sólo está $b, $b va después */
elseif ($iab)
return 1;
/* Si no está ninguna de las dos, miramos cuál va primero alfabéticamente */
else
return strcmp($a,$b);
}

sort($provincias);

print_r($provincias);

usort($provincias, 'ordena_provincias');
print_r($provincias);
?>

Primero se muestra el array de las provincias ordenadas por orden alfabético, y luego nuestra ordenación especial (con cuatro provincias como las primeras).

La ordenación la basamos en la función usort(), y como función de intercambio utilizará ordena_provincias() esta función tiene otro array con las provincias que deben ir primero.

Jugando con ImageMagick (II): Color y rotación

Miércoles, 1 de Septiembre de 2010 Gaspar Fernández Sin comentarios

Sigo con la serie de posts sobre ImageMagick, anteriormente estuvimos viendo cómo podemos redimensionar, añadir y quitar bordes a la imagen, cambiar y ecualizar el espacio de color, añadir efectos y capturar de la pantalla. Ahora veremos más cosas relacionadas con el color:

Tocando los canales de color

hamburgueson_33Imagina que queremos aplicar un efecto sólo en un canal, por ejemplo, un efecto radial-blur sólo en el canal rojo:

$ convert -channel red -radial-blur 30 hamburgueson.jpg hamburgueson_rojo.jpg

Donde 30 es el radio del emborronamiento (blur) radial.

Pero por ejemplo, si queremos aumentar el nivel de rojo, verde, o azul (o de los tres valores) de una imagen, podemos modificar los niveles de blanco y negro de la propia imagen.

tazasPara el ejemplo superior:

$ convert -level 30,100% taza.jpg taza_oscura.jpg

$ convert -channel blue -level 0,50% taza.jpg taza_azul.jpg

$ convert -channel red -level 30,80% taza.jpg taza_arojo.jpg

De izquierda a derecha.

Podemos también obtener la imagen a dos colores (blanco y negro), obtenido desde un valor umbral (valores inferiores, se representarán con negro y superiores con blanco), aunque, como veremos en el ejemplo, también podemos filtrar según el canal:

tazas1Para este ejemplo, hice lo siguiente:

$ convert -threshold 25% taza1.jpg tazaBN.jpg

$ convert -channel red,blue -threshold 55% taza.jpg taza_naranja_verde.jpg

$ convert -channel green -threshold 75% taza_magenta.jpg

Más efectos de color

taza_3Para conseguir el tono sepia hacemos lo siguiente:

$ convert -sepia-tone [umbral] origen destino

En el ejemplo hice lo siguiente:

$ convert -sepia-tone 90% taza.jpg taza_sepia.jpg

También disponemos del efecto posterizado (si no se aprecia bien en la miniatura, hacer click para ver en grande). Para conseguir el efecto hacemos lo siguiente:

taza_31

$ convert -posterize 4 taza.jpg taza_poster.jpg

Donde 4 es el número de niveles con el que vamos a posterizar.

También tenemos el efecto solarizado con el siguiente comando:

$ convert -solarize 2% taza.jpg taza_sol.jpg

taza_32Donde el 2% es el umbral deseado para el efecto, que vemos en la siguiente imagen.

Para completar los efectos de color, veamos también cómo podemos cambiar brillo, saturación y tono. Para controlarlo tenemos la orden:

$ convert -modulate [brillo],[saturacion],[tono] origen destino

Vemos en el siguiente ejemplo las imágenes con los efectos uno a uno:

tazas2

# En la primera se ha modificado el tono de la imagen:

$ convert -modulate 100,100,142 taza.jpg taza_hue.jpg

# En la segunda se modificó la saturación

$ convert -modulate 100,142,100 taza.jpg taza_sat.jpg

# En la tercera se cambió el brillo:

$ convert -modulate 142,100,100 taza.jpg taza_brillo.jpg

Todos estos parámetros se indican en porcentaje.

Rotación y transposición

Además de estos efectos de color, encontramos también algunas transformaciones de imagen

tazas3

$ convert -flip taza.jpg taza1.jpg

$ convert -flop taza.jpg taza2.jpg

$ convert -transpose taza.jpg taza3.jpg

$ convert -transverse taza.jpg taza4.jpg

taza_2

Para la rotación de la imagen ejecutamos lo siguiente:

$ convert -rotate 40 taza.jpg taza_r.jpg

Donde 40 es la cantidad de grados a rotar.

taza_33Para la rotación hay otra orden muy curiosa: polaroid. La podemos utilizar de la siguiente manera:

$ convert -polaroid 40 taza.jpg taza_p.jpg

Visita otras webs de la red