Ejemplos de ImageMagick -- Deformación de imágenes
- Prefacio e índice de los ejemplos de ImageMagick
- Deformación simple de imágenes (reordenar el orden de los píxeles)
- Volteo y reflejo de imágenes
- Transposición y trasversión, en diagonal
- Rotaciones rectangulares
- Desplazamiento cíclico de imágenes (como un televisor estropeado)
-
Rotación de imágenes (rotaciones simples de imágenes)
- Cizallamiento de imágenes (desplazamiento lineal)
-
Ondulación de imágenes (desplazamiento por onda sinusoidal)
- Explosión de imágenes
-
Animaciones (ejemplos divertidos) En esta sección veremos los operadores de deformación y distorsión de imágenes más generales y simples que ofrece ImageMagick. Se trata de una forma de abrir el apetito para las distorsiones más avanzadas y complejas que veremos en secciones posteriores.
Deformación simple de imágenes
Los operadores de deformación simple de imágenes solo reordenan los píxeles de la imagen. El número de píxeles e incluso el tamaño de la imagen permanecen iguales. La característica clave es que la imagen no pierde ninguna información, solo se reordena, y podría devolverse muy fácilmente a su estado normal sin ninguna pérdida de calidad (excluyendo la compresión con pérdida tipo JPEG al guardar). Básicamente, solo reordena los píxeles, sin destruir, sobrescribir, copiar, mezclar colores ni modificar de otro modo el contenido de la imagen original. Únicamente mueve las posiciones de los píxeles dentro de la imagen.
Volteo y reflejo
Para estos ejemplos usemos esta tierna imagen de un koala. La distorsión de imagen más simple consiste en reordenar los píxeles de la imagen para voltearla boca abajo con "-flip". |
magick koala.gif -flip flip.gif
![[IM Output]](../static/img/warping/flip.gif)
O bien, usando "-flop" puedes generar una imagen reflejada. |
magick koala.gif -flop flop.gif
![[IM Output]](../static/img/warping/flop.gif)
| Antes de IM v6.6.6-5, tanto el operador "[-flip](https://imagemagick.org/command-line-options/#flip)" como el "[-flop](https://imagemagick.org/command-line-options/#flop)" no modificaban el desplazamiento del lienzo virtual de la imagen, en relación con un lienzo virtual más grande que pudiera estar presente
---|---
Transposición y trasversión, en diagonal
Las operaciones de imagen "-transpose" y "-transverse" producen reflejos diagonales de la imagen. "-transpose" refleja la imagen a lo largo de la diagonal que va de la esquina superior izquierda a la inferior derecha. |
magick koala.gif -transpose transpose.gif
![[IM Output]](../static/img/warping/transpose.gif)
Mientras que "-transverse" refleja la imagen a lo largo de la diagonal que va de la esquina inferior izquierda a la superior derecha. |
magick koala.gif -transverse transverse.gif
![[IM Output]](../static/img/warping/transverse.gif)
| Antes de IM v6.6.6-5, tanto el operador "[-transpose](https://imagemagick.org/command-line-options/#transpose)" como el "[-transverse](https://imagemagick.org/command-line-options/#transverse)" no modificaban el desplazamiento del lienzo virtual de la imagen, en relación con un lienzo virtual más grande que pudiera estar presente
---|---
Rotaciones rectangulares
Los cuatro tipos de operaciones mostrados arriba producen, en esencia, una imagen reflejada de la original. El operador "-rotate" proporciona las demás versiones no reflejadas de la imagen, incluida la propia imagen original.
magick koala.gif -rotate 0 rotate_0.gif
magick koala.gif -rotate 90 rotate_90.gif
magick koala.gif -rotate 180 rotate_180.gif
magick koala.gif -rotate -90 rotate-90.gif
magick koala.gif -rotate 360 rotate_360.gif
Ten en cuenta que "-rotate" es una distorsión simple solo si usas un ángulo de rotación múltiplo de 90 grados. Cualquier otro ángulo introducirá en la imagen otras distorsiones más complejas a nivel de píxel. Consulta Rotación más abajo. |
Quizá notes que un ángulo de rotación positivo gira en el sentido de las agujas del reloj, lo que parece lógicamente incorrecto. Sin embargo, internamente es matemáticamente correcto y se debe al uso de un eje Y negado. Es decir, el eje Y vale 0 en la parte superior y es positivo hacia abajo. Por ello el sistema de coordenadas queda invertido y, en consecuencia, el ángulo de rotación también se invierte matemáticamente. |
|---|---|
Las fotos digitales también pueden rotarse para que coincidan con laorientación de la cámara registrada, usando el operador "-auto-orient". Esto se añadió en IM v6.2.7-8. |
|
| --- | --- |
Desplazar cíclicamente las imágenes como un televisor estropeado
También puedes desplazar cíclicamente ("-roll") una imagen en horizontal (como un televisor fuera de sincronía). La cantidad del desplazamiento (el corrimiento de la imagen) se indica en píxeles. |
magick koala.gif -roll +0+20 roll_horiz.gif
![[IM Output]](../static/img/warping/roll_horiz.gif)
Por supuesto, también puedes desplazar la imagen de lado... |
magick koala.gif -roll +30+0 roll_vert.gif
![[IM Output]](../static/img/warping/roll_vert.gif)
O bien, usando un número negativo de píxeles, puedes desplazarla en la dirección opuesta. |
magick koala.gif -roll +0-20 roll-horiz.gif
![[IM Output]](../static/img/warping/roll-horiz.gif)
Los desplazamientos cíclicos son especialmente importantes para las imágenes en mosaico, ya que reposicionan el origen del mosaico sin destruir la capacidad de "embaldosado" de las imágenes. De hecho, eso es exactamente lo que define el ajuste "-tile-offset": cuánto desplazamiento aplicar a una imagen en mosaico a medida que la lee la opción "-tile".
Resumen de la deformación simple de imágenes
El aspecto más importante de todos estos operadores es que puedes combinarlos de muchas formas distintas de modo que el resultado sea exactamente igual que si no se hubiera realizado ninguna operación. |
magick koala.gif -roll +25+0 -rotate 90 -flop \
-roll +0-25 -flip -rotate 90 original.gif
Rotación y cizallamiento
Mientras que los operadores de distorsión simple (vistos arriba) preservan el tamaño y el color de las imágenes, el siguiente conjunto no lo hace. Los resultados de estos operadores no caben en el tamaño original, ni siquiera en la rejilla de trama original de la imagen.
Rotación de imágenes -- rotación simple de imágenes
Como viste arriba, el operador "-rotate" puede realizar distorsiones simples que preservan la imagen cuando la rotas en unidades de 90 grados. Con otros ángulos, sin embargo, la imagen rotada no encajará bien en una imagen rectangular. En consecuencia, para garantizar que no se pierda ningún dato de la imagen, el tamaño de la imagen final se agranda lo justo para dar cabida a la imagen rotada. |
magick koala.gif -rotate 30 rotate.jpg
![[IM Output]](../static/img/warping/rotate.jpg)
Ten en cuenta que la dirección de rotación es en el sentido de las agujas del reloj. Esto puede parecer ilógico desde el punto de vista matemático, hasta que te das cuenta de que el sistema de coordenadas de la imagen es relativo a la esquina superior izquierda de la imagen, en lugar de la convención matemática de la esquina inferior izquierda. El resultado es que el ángulo de rotación es el opuesto al que lógicamente esperarías. Esto es importante tenerlo presente al tratar con cualquier forma de rotación de imágenes, en comparación con una rotación matemática. El espacio extra añadido por ImageMagick se colorea con el ajuste de color "-background" actual. Esto te permite especificar el color con el que rellenar las esquinas. |
magick koala.gif -background lightskyblue -rotate 30 rotate_color.png
![[IM Output]](../static/img/warping/rotate_color.png)
Por supuesto, si quieres rellenar con el color transparente, deberás asegurarte de que la imagen pueda manejar la transparencia (habilitando o añadiendo un canal alfa) y de que se guarde en un formato de imagen capaz de manejar la transparencia. |
magick koala.gif -alpha set -background none -rotate 30 rotate_trans.png
![[IM Output]](../static/img/warping/rotate_trans.png)
Si el espacio extra sale en negro, significa que el formato de la imagen de salida no permite el uso de un canal alfa (lo más probable es que sea el formato JPEG), por lo que la transparencia toma negro de forma predeterminada. | Antes de la versión 6.1.2, "-rotate" no manejaba correctamente la transparencia, produciendo franjas de negro y transparente en las esquinas de la imagen rotada. La solución alternativa a este problema era bastante compleja, e implicaba rotar el canal alfa por separado de los colores.
---|---
Pero ¿qué pasa si no quieres ese espacio extra y deseas preservar el tamaño original de la imagen? Pues bien, puedes usar un "-crop" centrado para devolver la imagen a su tamaño original. Si no sabes cuál era el tamaño original, puedes usar un truco de composición alfa (consulta el método de composición '[Src](compose.html#src)') para restaurar la imagen a su tamaño original. |
magick koala.gif -alpha set \( +clone -background none -rotate 30 \) \
-gravity center -compose Src -composite rotate_resized.png
![[IM Output]](../static/img/warping/rotate_resized.png)
El operador "-rotate" también entiende dos indicadores adicionales. Si se añade un símbolo '>' al argumento de rotación (antes o después del número), la imagen solo se rotará si es más ancha que alta. Es decir, un '90>' solo rotará las imágenes de estilo 'apaisado' (anchas) a imágenes de estilo 'vertical' (altas), de modo que todas las imágenes queden en estilo 'vertical'. El otro indicador, '<', hace lo contrario: solo rota las imágenes que son más altas que anchas. Por ejemplo, '90<' se asegurará de que todas las imágenes queden 'apaisadas'. Otro uso de este indicador es rotar las imágenes 'verticales' y 'apaisadas' en cantidades distintas. Es decir, puedes dar dos operaciones "-rotate" diferentes para inclinar las 'verticales' en una dirección y las 'apaisadas' en otra dirección. Las fotos digitales también pueden rotarse para que coincidan con la orientación de la cámara (según los metadatos EXIF de la imagen) usando el operador "-auto-orient". Sin embargo, recuerda que volver a guardar en formato JPEG quizá no sea una buena idea.
Funcionamiento interno del operador de rotación
A partir de IMv6.7.3-4, el operador de rotación usa ahora el operador de distorsión y la distorsión Scale-Rotate-Translate (SRT). Aquí tienes la rotación más directa usando la distorsión SRT subyacente. |
magick koala.gif -virtual-pixel background -background lightskyblue \
-distort SRT 30 +repage rotate_srt.jpg
![[IM Output]](../static/img/warping/rotate_srt.jpg)
O bien, usando la versión '+' del operador de distorsión para ajustar el tamaño del lienzo. |
magick koala.gif -virtual-pixel background -background lightskyblue \
+distort SRT 30 +repage rotate_srt2.jpg
![[IM Output]](../static/img/warping/rotate_srt2.jpg)
El operador de distorsión general ofrece muchos otros controles para aspectos como el posicionamiento exacto del centro de rotación, el escalado, el control del filtro, el tamaño de la imagen de salida y controles para el apilamiento de imágenes que el operador de rotación más simple no proporciona. Antes de IMv6.7.3-4, el operador de rotación se implementaba mediante distorsiones simples de rotación de 90 grados seguidas de tres cizallamientos de imagen, una técnica conocida como 'rotación por cizallamiento' (Rotate by Shear, RBS). Una técnica publicada por primera vez en artículos de investigación por Alan Paeth. Lamentablemente, como esto requiere 3 operaciones de cizallamiento separadas, se obtienen efectos de desenfoque muy variables y severos, especialmente al cizallar líneas finas, razón por la cual la rotación ahora se implementa mediante distorsión. Puedes ver los efectos perjudiciales de esto en las animaciones de rotación más abajo. La función de biblioteca que rotaba mediante 'cizallamientos' sigue disponible en la API, pero ya no está disponible desde la línea de comandos, a menos que realices los cizallamientos tú mismo. Consulta el operador de cizallamiento más abajo para los detalles completos de la técnica.Para una comprensión más profunda de los distintos algoritmos de rotación de imágenes, de cómo funcionan y de las cuestiones implicadas, consulta Leptonica Rotation. Y los ejemplos usados en Técnicas generales de distorsión.
Cizallamiento de imágenes -- desplazamiento lineal
El operador "-shear" toma cada fila (o columna) de píxeles y la desliza de modo que cada fila (o columna) quede desplazada la misma cantidad respecto a la fila (o columna) vecina. Sus dos argumentos se dan en forma de ángulos. Al igual que con "-rotate", la operación aumenta el tamaño de la imagen resultante para no perder ninguna información. Sin embargo, el cizallamiento es más complejo, ya que en realidad es una operación doble.
magick koala.gif -background Blue -shear 20 shear_rot.gif
magick koala.gif -background Blue -shear 20x0 shear_x.gif
magick koala.gif -background Blue -shear 0x50 shear_y.gif
magick koala.gif -background Blue -shear 20x50 shear_xy.gif
magick koala.gif -background Blue -shear 20x0 -shear 0x50 shear_xy2.gif
magick koala.gif -background Blue -shear 0x50 -shear 20x0 shear_yx.gif
Si observas los resultados, verás que un "-shear" X-Y completo (cuarta imagen) equivale en realidad a hacer primero el cizallamiento X, seguido del cizallamiento Y (con un recorte adecuado de la imagen), como se muestra en la quinta imagen, o penúltima. Ten en cuenta que el orden de los cizallamientos produce resultados distintos. Si solo se proporciona un número (sin ninguna 'x' en el argumento, como en la primera imagen), "-shear" lo aplicará tanto en la dirección X como en la Y, como una especie de rotación rudimentaria. El ajuste de color "-background" se usa, por supuesto, como color del espacio extra añadido. |
magick koala.gif -background none -shear 30 shear_trans.png
![[IM Output]](../static/img/warping/shear_trans.png)
| Antes de la versión IM 6.1.2, "-shear" no manejaba la transparencia. La solución alternativa a este problema era bastante compleja, e implicaba cizallar el canal alfa por separado de los colores.
---|---
Ten en cuenta que usar "-shear" de esta forma no es un método correcto para rotar una imagen. Para usar realmente el cizallamiento para rotar una imagen correctamente, tendrías que realizar varias operaciones de cizallamiento de la forma "-shear {X}x{Y} -shear {X}x0 -crop ...", aunque calcular los valores adecuados para '{X}', '{Y}' y el recorte final requiere algo de trigonometría. El "operador de rotación" solía implementarse de esta manera, y la función de la API que hace esto sigue disponible, pero ya no desde la línea de comandos. | Ten en cuenta que el cizallamiento en la dirección X no afecta a la altura de una imagen, mientras que el cizallamiento en la dirección Y no afecta a su anchura. El resultado es que el área que cubre algún objeto dentro de la imagen no cambia (solo cambia el contenedor circundante que sostiene la imagen).
---|---
| _Eloperador de cizallamiento se implementa como una 'deformación' directa (distorsionando los píxeles solo en filas y columnas individuales) de la imagen de origen. En consecuencia, no usa el ajuste de interpolación ni el ajuste de píxel virtual.
Como resultado, las áreas añadidas a la imagen solo se rellenan con el color "-background" actual, y no se proporciona ningún método para preservar los colores originales de la imagen._
---|---
Para un método alternativo que permite el uso de filtros de imagen, interpolación y píxeles virtuales, consulta Distorsión afín. Para información sobre el uso de matrices afines para implementar cizallamientos, consulta Cizallamiento afín. Sin embargo, ninguno de los dos métodos permite especificar los cizallamientos mediante argumentos de ángulos.
Cubo isométrico mediante cizallamientos
Aunque los cizallamientos no son los operadores más agradables ni más simples de usar, eso no significa que no puedas hacer cosas vistosas con ellos. El siguiente es un ejemplo de uso de "-shear" para crear un cubo isométrico. |
# Create some square images for the cube
magick logo: -resize 256x256^ -gravity center -extent 256x256 top.jpg
magick ../img_photos/pagoda_sm.jpg -resize 256x256 left.jpg
magick ../img_photos/mandrill_orig.png -resize 256x256 right.jpg
# top image shear.
magick top.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 -rotate -60 -gravity center -crop 520x301+0+0 \
top_shear.png
# left image shear
magick left.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 left_shear.png
# right image shear
magick right.jpg -resize 260x301! -alpha set -background none \
-shear 0x-30 right_shear.png
# combine them.
magick left_shear.png right_shear.png +append \
\( top_shear.png -repage +0-149 \) \
-background none -layers merge +repage \
-resize 30% isometric_shears.png
# cleanup
rm -f top.jpg left.jpg right.jpg
rm -f top_shear.png left_shear.png right_shear.png
![[IM Output]](../static/img/warping/isometric_shears.png)
Lo anterior se desarrolló a partir de un ejemplo de archivo por lotes de Windows similar de Wolfgang Hugemann ImageMagick@Hugemann.de en su contribución Using IM under Windows a los ejemplos de IM. Ten en cuenta que las imágenes de arriba NO están unidas correctamente. Deberían usar la composición alfa Plus, pero en su lugar usan over. Para más información, consulta Alinear dos imágenes enmascaradas. Como resultado, puedes tener problemas para alinear correctamente las tres imágenes, lo que produce huecos o solapamientos de las imágenes. Como el posicionamiento está restringido a posiciones enteras, este problema puede ser especialmente grave. Usar un tamaño mucho mayor con coordenadas más fáciles de manejar, y ajustar un poco los cálculos, puede ayudar en este caso. Una vez fusionadas las imágenes, reducir el resultado a su tamaño final afilará y limpiará cualquier ligera desalineación a lo largo de las uniones. Otro ejemplo similar, pero que usa distorsiones afines y una composición alfa correcta, es Cubos 3D mediante apilamiento afín. Un método que simplifica enormemente el procesamiento de imágenes necesario para generar cubos como el anterior.
Ondulación de imágenes - desplazamiento por onda sinusoidal
El operador "-wave" se parece a "-shear" en que añade un 'desplazamiento lineal' a las imágenes. Sin embargo, este operador solo desplaza columnas de píxeles verticalmente según una función de onda sinusoidal. El operador "-wave" tiene dos argumentos. El primero es la altura máxima, o amplitud, a la que se desplazarán los píxeles hacia arriba o hacia abajo, mientras que el segundo es la longitud de onda de la función sinusoidal en píxeles. |
magick koala.gif -background Blue -wave 10x64 wave.jpg
![[IM Output]](../static/img/warping/wave.jpg)
Ten en cuenta que, como los píxeles pueden desplazarse hasta la amplitud indicada, siempre se añadirá esa cantidad de espacio extra tanto en la parte superior como en la inferior de la imagen, aunque ese espacio no sea realmente necesario. Por ejemplo, ajustando los argumentos para que la longitud de onda sea el doble de la anchura de la imagen, puedes convertir la imagen en un arco. |
magick koala.gif -background Blue -wave 20x150 arched.jpg
![[IM Output]](../static/img/warping/arched.jpg)
En un caso así, el espacio no utilizado puede eliminarse usando una operación "-chop", "-shave" o, posiblemente, incluso "-trim". Limpiemos el ejemplo anterior usando una amplitud negativa para voltear el arco, y usando "-chop" para eliminar el espacio no utilizado que añadió el operador "-wave". |
magick koala.gif -background Blue -wave -20x150 \
-gravity South -chop 0x20 arched_2.jpg
![[IM Output]](../static/img/warping/arched_2.jpg)
Por supuesto, el ajuste de color "-background" puede usarse para definir el espacio extra que se añade a la imagen. |
magick koala.gif -alpha set -background none -wave 10x75 wave_trans.png
![[IM Output]](../static/img/warping/wave_trans.png)
Como puedes ver en los ejemplos anteriores, "-wave" solo se aplica en la dirección vertical o 'Y'. Si quieres añadir una onda en la dirección X, tendrás que rotar la imagen antes y después de aplicar la onda. |
magick koala.gif -rotate -90 -background Blue -wave -10x75 \
-rotate +90 wave_y.jpg
![[IM Output]](../static/img/warping/wave_y.jpg)
La técnica puede usarse para añadir un patrón de onda o una vibración a una imagen en cualquier ángulo. Ejemplos de esto se dan en la fuente Vibrato y en la fuente Smoking. Otra limitación de "-wave" es que la onda solo empieza en cero. Es decir, la columna más a la izquierda no se desplaza, mientras que las siguientes filas se desplazan hacia abajo (dirección X positiva), a menos que des una amplitud negativa como desplazamiento vertical inicial. Básicamente, el operador "-wave" no permite (por ahora) especificar un desplazamiento para el inicio de la función sinusoidal. Sin embargo, esto puede corregirse añadiendo, y luego eliminando, un desplazamiento de la imagen mediante "-splice". |
magick koala.gif -splice 19x0+0+0 -background Blue -wave 10x75 \
-chop 19x0+0+0 wave_offset.jpg
![[IM Output]](../static/img/warping/wave_offset.jpg)
Aunque "-wave" no usa el ajuste de píxel virtual actual para definir el color de las áreas añadidas, sí tiene en cuenta el ajuste de interpolación actual para mapear los colores de la fuente a la imagen generada. Esto significa que la onda tenderá a desenfocar ligeramente los píxeles en bandas verticales a lo largo de la imagen.
Distorsiones circulares
Hasta ahora, las distorsiones de imagen han sido bastante suaves, con muy poco estiramiento, expansión o compresión de los datos de la imagen. Es decir, los datos permanecen prácticamente sin cambios. Estos próximos operadores de imagen pueden dar como resultado una imagen tan distorsionada que la imagen original no se pueda determinar. Los colores se retuercen en una mezcolanza borrosa. También ocurre que limitan los efectos de distorsión a un área circular, con poca o ninguna distorsión de la imagen original en el borde del rectángulo de la imagen. Eso significa que puedes usar estos operadores sobre un área más pequeña mediante el operador de región, y el resultado seguirá fundiéndose con la imagen original sin que parezca que se ha: recortado, deformado y vuelto a pegar en su sitio. Es decir, estos operadores se conocen como distorsión 'local', ya que podrían usarse para deformar áreas más pequeñas de una imagen.
Implosión de imágenes
El operador "-implode" deforma la imagen de modo que atrae todos los píxeles hacia el centro. Es algo así como clavar una aspiradora, o un 'agujero negro', en el centro de la imagen y succionar los píxeles hacia él. No obstante, se aconseja precaución y usar valores muy pequeños para empezar, aumentándolos lentamente hasta obtener el resultado deseado. La mayoría de los usuarios noveles tienden a usar un valor demasiado grande y se decepcionan con el resultado. Por ejemplo, esta es una implosión de imagen típica. |
magick koala.gif -implode .6 implode.gif
![[IM Output]](../static/img/warping/implode.gif)
Usar valores cada vez mayores succionará, en esencia, todos los píxeles del círculo hacia el olvido. |
magick koala.gif -implode 5 implode_big.gif
![[IM Output]](../static/img/warping/implode_big.gif)
Sin embargo, ten en cuenta que usar cualquier valor de "-implode" mayor que '1.0' también se ve afectado por el ajuste de píxel virtual, ya que el algoritmo empieza a hacer referencias de color más allá de los límites de la propia imagen real. Como el ajuste predeterminado de "-virtual-pixel" es 'edge', el color del borde o el marco circundante de una imagen puede tener un efecto importante en el resultado. Por ejemplo, estas dos imágenes son iguales salvo que a una se le añadió un borde blanco. Esto muestra básicamente el área que está usando colores tomados de más allá de los límites de la imagen propiamente dicha. El área normalmente definida por el ajuste "-virtual-pixel". |
magick rose: -gravity center -crop 46x46+0+0 +repage \
-implode 3 implode_rose.gif
magick rose: -gravity center -crop 44x44+0+0 +repage \
-bordercolor white -border 1 -implode 3 implode_rose_2.gif
![[IM Output]](../static/img/warping/implode_rose_2.gif)
Usar distintos ajustes de píxel virtual, como '[Background](misc.html#background)', producirá el mismo efecto que añadir "-border", pero sin agrandar la imagen. Otros ajustes de píxel virtual pueden producir efectos mucho más interesantes en la región central implosionada. Por ejemplo, usar un ajuste '[Tile](misc.html#tile)' puede añadir copias muy distorsionadas de la imagen. Por ejemplo, aquí implosiono una imagen simple de una caja usando este ajuste. |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -implode 4 implode_tiled_box.gif
![[IM Output]](../static/img/warping/implode_tiled_box.gif)
Se exploran más efectos de "-virtual-pixel" en Efectos de implosión de los píxeles virtuales. A medida que el número de píxeles que se implosionan en un área pequeña aumenta, y el tamaño del parámetro de implosión se vuelve muy grande, los resultados empiezan a adoptar un aspecto 'pixelado'. Para obtener un resultado mejor y más consistente, puedes aumentar el número de píxeles con los que trabaja la implosión usando una técnica llamada supermuestreo. Básicamente, usando una imagen más grande (ampliando la imagen de origen si es necesario), haciendo la distorsión y luego reduciendo el resultado a su tamaño final, obtendrás un resultado mucho mejor. |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -resize 400% -implode 4 -resize 25% \
implode_tiled_ss.gif
![[IM Output]](../static/img/warping/implode_tiled_ss.gif)
Como puedes ver, obtienes un resultado mucho más suave y realista que muestra mucho mejor el detalle interno de la distorsión. Sin embargo, incluso el supermuestreo se viene abajo en imágenes extremas como esta, ya que implica infinitos. Si miras con atención, verás que el aspecto 'moteado' regresa, pero solo más cerca del centro. Usando un "-border" más grande alrededor de la imagen que se implosiona, y eliminándolo después de nuevo, también puedes deformar los bordes de una imagen hacia dentro, en dirección al centro. |
magick koala.gif -bordercolor blue -border 20x20 \
-implode .5 -shave 18x18 implode_border.jpg
![[IM Output]](../static/img/warping/implode_border.jpg)
A partir de la versión IM 6.2.1, también puedes usar un borde transparente, o una imagen con transparencia. |
magick koala.gif -bordercolor none -border 20x20 \
-implode .5 -shave 18x18 implode_border_trans.png
Explosión de imágenes
Usando un valor negativo con el operador "-implode", puedes hacer explotar la imagen. Sin embargo, esto se parece más a ampliar el centro de la imagen empujando todos los píxeles de radio medio hacia el borde, que a una verdadera explosión. |
magick koala.gif -implode -2 explode.jpg
![[IM Output]](../static/img/warping/explode.jpg)
Usar un valor mayor ampliará, en esencia, los píxeles más centrales de la imagen hasta formar un círculo de dos tercios del tamaño de la dimensión más pequeña de la imagen. |
magick koala.gif -implode -30 explode_big.jpg
![[IM Output]](../static/img/warping/explode_big.jpg)
Y aquí tienes una versión 'supermuestreada'. |
magick koala.gif -resize 400% -implode -30 \
-resize 25% explode_big_ss.jpg
![[IM Output]](../static/img/warping/explode_big_ss.jpg)
El color central de la 'explosión' interna se establece por el color del centro de la imagen (o región). Esto significa que, cambiando los colores alrededor de ese punto antes de explotar, puedes controlar un efecto de 'destello' de la explosión. Consulta las animaciones más abajo para ver un ejemplo animado de este control de color. Para otro ejemplo de imágenes implosionadas, consulta las contribuciones del usuario hh en Flickr.
Remolinos en las imágenes
El operador "-swirl" actúa como una batidora de repostería. Deformará la imagen formando un círculo, girándola el número de grados que le des como argumento. |
magick koala.gif -swirl 180 swirl.jpg
![[IM Output]](../static/img/warping/swirl.jpg)
Añadiendo un borde y combinándolo con "-implode", puedes dar la apariencia de un remolino que succiona la imagen hacia el olvido. |
magick koala.gif -bordercolor white -border 20x20 \
-swirl 180 -implode .3 -shave 20x20 whirlpool.jpg
![[IM Output]](../static/img/warping/whirlpool.jpg)
La naturaleza clave de esta distorsión es que la imagen quedará rotada en el centro el ángulo que especifiques, mientras que el borde circular (como en el operador de implosión anterior) permanece inalterado. Por ahora no hay ningún parámetro para especificar un 'radio interno' que limite el remolino a un anillo, en lugar de a un disco completo. He animado estos efectos de remolino, que puedes ver más abajo en Animaciones.
Animaciones (ejemplos divertidos)
Para terminar, generemos algunas animaciones GIF de algunas de estas distorsiones. Para ellas, generé unos sencillos scripts de shell que crean la imagen animada, que también puedes descargar y con los que puedes experimentar usando tus propias imágenes de prueba. Esto me lleva a un punto importante. Si generas una serie de imágenes con estas distorsiones, es mejor distorsionar siempre a partir de la imagen inicial original, en lugar de distorsionar la imagen de forma incremental una y otra vez. Esto es especialmente cierto en las imágenes rotadas, donde hay cierto desenfoque del resultado que, aunque mínimo en cualquier operación individual, si lo haces una y otra vez, te deja estos resultados. Todos los scripts usan una técnica de 'comando "magick" generado' para crear la animación. Es decir, un script de shell crea un único comando largo, que luego se ejecuta. Esto evita la necesidad de generar archivos temporales, aunque puede dificultar la depuración. Otra alternativa es usar un método conocido como transmisión de imágenes MIFF, que genera imágenes individuales en un bucle y las 'canaliza' hacia un comando final de 'fusión'. Esto se muestra con más claridad en los ejemplos Posicionamiento programado de imágenes en capas y Chinchetas en un mapa. ![]() |
En el script de shell "animate_mixer", cada fotograma se genera usando "-swirl" sobre la imagen original. El remolino se anima en una dirección y luego vuelve de nuevo para formar un ciclo continuo. Este es, de hecho, un ejemplo de animación de deformación muy típico en IM. Una variación de esto consiste en que la animación 'desdeforme' la imagen hacia una imagen distinta pero similar. |
|---|---|
![]() |
El script de shell "[animate_whirlpool](../static/img/warping/animate_whirlpool)" no solo usa "[-swirl](https://imagemagick.org/command-line-options/#swirl)" en cada fotograma de imagen, sino que además usa "-implode" con un tamaño de argumento creciente. Usé un color de borde 'lightblue' para el espacio añadido para mostrar que toda la imagen será 'succionada por el desagüe', aunque debería haber usado en su lugar el mismo color de fondo blanco, para lograr un efecto mejor y más realista. |
| --- | --- |
![]() |
Una explosión en el centro de la imagen (consulta el script "animate_explode"). La imagen se amplía de nuevo para que toda la imagen explote, y se dibuja un punto coloreado en el centro para definir el color final. |
| --- | --- |
![]() |
Usando el script de shell "animate_flex", el centro de la imagen se flexiona hacia arriba y hacia abajo cambiando la amplitud de la función "-wave" tanto a valores positivos como negativos. |
| --- | --- |
![]() |
Usando el script de shell "animate_flag", creo una animación de 'onda con desplazamiento' para hacer que la imagen ondee como una bandera. La animación puede mejorarse desplazando también verticalmente cada fotograma de la imagen para que el borde izquierdo permanezca constante, y quizá añadiendo un asta de bandera. Sin embargo, eso requiere determinar matemáticamente ese desplazamiento, lo que puede ser complicado. |
| --- | --- |
![]() |
El script "animate_rotate" generó esta animación de rotación, pero recorta cada fotograma con la imagen original, como se ha descrito antes, para preservar el tamaño original de la imagen. |
| --- | --- |
![]() |
A modo de comparación, aquí tienes una rotación de koala generada usando los ajustes predeterminados y el comando "-distort SRT {angle}". El script usado para generarla es "animate_distort_rot". Fíjate en lo mucho más nítida que es la imagen con este método de rotación, y en la ausencia de la 'vibración' rotacional que se aprecia en la versión anterior. |
| --- | --- |
Animaciones y vídeos extra
Como extra, Florent Monnier, de Francia, creó un vídeo ingenioso usando el operador de distorsión "[-swirl](https://imagemagick.org/command-line-options/#swirl)", hecho con un script de la API de IM en OCaml. Selecciona la animación GIF de la derecha para descargar la versión completa del vídeo. ¿Puedes hacer un buen vídeo que muestre una técnica de mapa de distorsión? ¿Conoces alguno en otro lugar de la red? Escríbeme.
![[IM Output]](../static/img/warping/rotate_0.gif)
![[IM Output]](../static/img/warping/rotate_90.gif)
![[IM Output]](../static/img/warping/rotate_180.gif)
![[IM Output]](../static/img/warping/rotate-90.gif)
![[IM Output]](../static/img/warping/rotate_360.gif)
![[IM Output]](../static/img/warping/original.gif)
![[IM Output]](../static/img/warping/shear_rot.gif)
![[IM Output]](../static/img/warping/shear_x.gif)
![[IM Output]](../static/img/warping/shear_y.gif)
![[IM Output]](../static/img/warping/shear_xy.gif)
![[IM Output]](../static/img/warping/shear_xy2.gif)
![[IM Output]](../static/img/warping/shear_yx.gif)
![[IM Output]](../static/img/warping/implode_border_trans.png)
![[IM Output]](../static/img/warping/animated_mixer.gif)
![[IM Output]](../static/img/warping/animated_whirlpool.gif)
![[IM Output]](../static/img/warping/animated_explode.gif)
![[IM Output]](../static/img/warping/animated_flex.gif)
![[IM Output]](../static/img/warping/animated_flag.gif)
![[IM Output]](../static/img/warping/animated_rotate.gif)
![[IM Output]](../static/img/warping/animated_distort_rot.gif)