⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://usage.imagemagick.org/advanced/index.html).

Ejemplos de ImageMagick -- Técnicas avanzadas

Ejemplos de ImageMagick: prefacio e índice | Viñetas 3D a partir de formas | | Usar un script para generar cantidades enormes de imágenes
Colorear y dar forma a una imagen de sombreado 3D en escala de grises
---|---|---|---
Hacer logotipos en 3D | Usar superposiciones transparentes para colorear la imagen con la forma básica
Reflejos | Añadir reflejos en superficies de muchos tipos.
Piezas de rompecabezas | Recortar y realzar una pieza de forma irregular a partir de una foto
Efectos «gel» | Ajustar el tamaño, el brillo y la nitidez del realce
Aclarar y oscurecer usando la composición 'Screen' y 'Multiply'
Efectos «aqua» | Usar 'curves' para ajustar los realces.
Estrellas y cometas en mosaico | Puntos aleatorios.
"¡Dios mío! ¡Está lleno de estrellas! -- 2001: Una odisea del espacio"
Destellos radiales | Generar rayos y anillos aleatorios alrededor de un punto central.
Esta página ofrece ejemplos muy extensos en los que se combinan varias técnicas para producir efectos compuestos de manipulación de imágenes, más allá de las operaciones básicas de IM. Las técnicas principales se resumen en el índice anterior. Aunque muchas técnicas se presentan en otras páginas, como la creación de plantillas de fuente, el etiquetado vistoso de imágenes o el uso de máscaras, estas páginas muestran cómo combinarlas para producir un efecto más complejo.


Viñetas 3D a partir de formas -- Un enfoque con scripts

En la web hay muchas imágenes de «viñetas» disponibles para tus listas. Pero también puedes generar tus propios objetos 3D, lo que te permite ajustar todo tu sitio web a un estilo concreto que le dé unidad. Una de las mejores formas de lograrlo es crear un script de «generación» que produzca automáticamente toda una gama de botones y formas con un estilo determinado, pero usando cualquier color que necesites. Este es uno de esos scripts, muy sencillo. Aquí usamos la opción «[-shade](https://imagemagick.org/command-line-options/#shade)» para generar objetos de aspecto 3D a partir de una simple transparencia con forma. La forma solo tiene transparencia nítida de tipo on/off, que se conserva con cuidado, de modo que puede usarse como imagen GIF transparente para el uso habitual en páginas web. Después, la imagen «sombreada» en escala de grises resultante se colorea con el operador «[-tint](https://imagemagick.org/command-line-options/#tint)», que fija los grises de tono medio de la imagen y deja intactos los tonos más extremos de negro y blanco. Tras ello, la forma original de la imagen proporcionada se vuelve a añadir al resultado coloreado. Como ventaja añadida, si la imagen de entrada solo tenía una transparencia booleana, el resultado también tendrá una transparencia booleana adecuada para una imagen en formato GIF.

    magick {_input_image_} -alpha set \
            \( +clone -channel A -separate +channel \
               -bordercolor black -border 5  -blur 0x2 -shade 120x30 \
               -normalize -blur 0x1 -fill {_color_} -tint 100 \) \
            -gravity center -compose Atop -composite \
            {_output_image_}

Ten en cuenta que el script anterior solo lee la imagen de entrada una vez. Esto te permite usar también el script dentro de una tubería de comandos, empleando «-» como nombre de archivo de entrada y de salida (quizá con un ajuste de formato de imagen de IM). Esto puede ser importante al escribir tus propios scripts de IM. El comando anterior se guardó en un script de shell muy sencillo llamado «create_bullet», y se ejecutaron los siguientes comandos para generar toda una gama de imágenes de símbolos en muchos colores distintos.

    magick +antialias -size 15x15 xc:none -draw 'circle 7,7 3,3'  ball.gif
    create_bullet ball.gif  grey    ball_grey.gif
    create_bullet ball.gif  red     ball_red.gif
    create_bullet ball.gif  green   ball_green.gif
    create_bullet ball.gif  blue    ball_blue.gif
    create_bullet ball.gif  yellow  ball_yellow.gif
    create_bullet ball.gif  maroon  ball_maroon.gif
    create_bullet ball.gif  cyan    ball_cyan.gif

    magick -size 12x12 xc:black   square.gif
    create_bullet square.gif  grey    square_grey.gif
    create_bullet square.gif  red     square_red.gif
    create_bullet square.gif  green   square_green.gif
    create_bullet square.gif  blue    square_blue.gif
    create_bullet square.gif  yellow  square_yellow.gif
    create_bullet square.gif  maroon  square_maroon.gif
    create_bullet square.gif  cyan    square_cyan.gif

    # retrieve asterix symbol from
    # [Anthony's Web Images, Symbols](http://www.cit.griffith.edu.au/images/Symbols/Images.html)
    create_bullet asterix.gif  grey    asterix_grey.gif
    create_bullet asterix.gif  red     asterix_red.gif
    create_bullet asterix.gif  green   asterix_green.gif
    create_bullet asterix.gif  blue    asterix_blue.gif
    create_bullet asterix.gif  yellow  asterix_yellow.gif
    create_bullet asterix.gif  maroon  asterix_maroon.gif
    create_bullet asterix.gif  cyan    asterix_cyan.gif

    # Use a heart symbol from "WebDings" font (22 point => 16x16 pixel image)
    magick -font WebDings -pointsize 22 -background none \
            label:Y -trim +repage    heart.png
    create_bullet heart.png  grey    heart_grey.png
    create_bullet heart.png  red     heart_red.png
    create_bullet heart.png  green   heart_green.png
    create_bullet heart.png  blue    heart_blue.png
    create_bullet heart.png  yellow  heart_yellow.png
    create_bullet heart.png  maroon  heart_maroon.png
    create_bullet heart.png  cyan    heart_cyan.png

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Para generar las viñetas solo se usa la forma o la transparencia de la imagen de origen, así que puede emplearse cualquier forma. Elige una forma propia que sea exclusiva de tu sitio web. Ten en cuenta también que pueden usarse tanto GIF como PNG, con o sin transparencia para definir la forma. El comando no distingue entre ambos. Si usas una imagen más grande que las mostradas aquí, quizá quieras aumentar la cantidad de desenfoque que se aplica antes de la operación de sombreado. De lo contrario, puede que solo se redondeen las zonas cercanas al borde de las imágenes. Además, puede ser mejor desenfocar varias veces en lugar de usar un valor de desenfoque grande (para aumentar la velocidad del desenfoque). Por supuesto, si haces alguna mejora o tienes otras ideas, dímelo para poder compartirlas con los demás.


Hacer logotipos en 3D

En este ejemplo tenemos un logotipo plano y coloreado, con una forma complicada, que queremos procesar para darle un aspecto 3D marcado. Para ello usamos el logotipo para generar realces y sombras, y los convertimos en transparencias que superponer sobre la imagen original. Esto emplea muchas técnicas distintas de todas las páginas de ejemplos para lograr el efecto, paso a paso. Este ejemplo hace un uso intensivo de imágenes generadas con el operador Shade y con diversos métodos de composición alfa. Te recomiendo familiarizarte con estos operadores de imagen antes de continuar, o consultarlos cuando quieras entender mejor lo que ocurre.


Sin embargo, antes de empezar necesitaremos un logotipo sencillo al que aplicar nuestra técnica, junto con su máscara... Creemos primero una forma para el fondo de color del logotipo de ejemplo... |

  magick -size 170x100 xc:black \
          -fill white -draw 'circle    50,50  13,50' \
                      -draw 'circle   120,50 157,50' \
                      -draw 'rectangle 50,13 120,87' \
          -fill black -draw 'circle    50,50  25,50' \
                      -draw 'circle   120,50 145,50' \
                      -draw 'rectangle 50,25 120,75' \
          -fill white -draw 'circle    60,50  40,50' \
                      -draw 'circle   110,50 130,50' \
                      -draw 'rectangle 60,30 110,70' \
          -gaussian 1x1 -alpha off logo_mask.png

[IM Output]
Ahora usamos la máscara para recortar el color sólido del logotipo y añadimos algo de texto para generar un logotipo plano de color sólido. |

  magick logo_mask.png -background red -alpha shape \
          -font Candice  -pointsize 36  -fill white  -stroke black \
          -gravity Center  -annotate 0 "Ant" \
          logo.png

[IM Output]


Demos ahora un aspecto 3D usando las técnicas de realce por superposición. |

  magick logo.png  -alpha extract -blur 0x6  -shade 110x30  -normalize \
          logo.png  -compose Overlay -composite \
          logo.png  -alpha on  -compose Dst_In  -composite \
          logo_3D.png

[IM Output]
Añadir sombras también es más fácil gracias al nuevo operador de generación de sombras que ofrece IM. |

  magick logo_3D.png \( +clone -background navy -shadow 80x4+6+6 \) +swap \
          -background none  -layers merge +repage logo_3D_shadowed.png

[IM Output]
Solo por diversión, terminemos superponiendo nuestro logotipo sobre un fondo parecido a «papel rugoso». También puede crearse una enorme cantidad de otros lienzos de fondo; consulta los ejemplos de fondos para ver una colección de ellos. |

  magick logo_3D_shadowed.png \
          \( +clone +repage -alpha off -fx 'rand()' -shade 120x30 \
             -fill grey70 -colorize 60 \
             -fill lavender -tint 100 \) \
          +swap -composite logo_3D_bg.jpg

[IM Output]


Reflejos

Los reflejos son relativamente fáciles de crear, aunque a menudo no lo parezca. Hay que lidiar con aspectos como el color y la textura de la superficie, y también con cómo aumenta ese efecto con la distancia entre el reflejo de la superficie y el objeto que esta refleja. En esencia, algo que debería ser relativamente sencillo se vuelve enseguida bastante complejo. [IM Output] Así que empecemos con el reflejo de una imagen relativamente sencilla, en este caso la imagen de un personaje de Pokémon, Azumarill (a la derecha). Sustitúyela por tu propia imagen si lo prefieres. Ahora bien, para hacer el reflejo de un espejo perfecto bastaría con copiar y voltear el objeto de origen, y añadir algo de fondo detrás para darle contexto. Por ejemplo...
|

  magick pokemon.gif \( +clone -flip \) -append \
          -size 100x100 xc:black +swap \
          -gravity North -geometry +0+5 -composite  reflect_perfect.png

[IM Output]

Color de la superficie - Atenuación general

Lo que hay que notar en lo anterior es que el reflejo, al ser perfecto, no parece realmente un reflejo en una superficie negra. Es más bien una «baldosa de espejo» de la imagen original, lo cual también es cierto. Ni siquiera un espejo normal de cuarto de baño refleja toda la luz que lo alcanza, y es de los mejores espejos que puedes conseguir. Así que la primera regla de los reflejos es...

Los reflejos no son nunca perfectos.

Ningún reflejo es un reflejo del 100 %, así que todos quedan coloreados por la superficie (o por el entorno circundante). El mundo es imperfecto, y los reflejos realzan y muestran muy bien esas imperfecciones. Probemos de nuevo, pero esta vez coloreemos el reflejo con el color de la superficie que refleja. Puedes hacerlo de dos maneras. El método más simple es colorear el reflejo con el mismo color que la superficie. La cantidad de color depende de lo buena que sea la superficie reflejando; en superficies de color suele ser bastante mala, así que hay que añadir una gran cantidad de color: «65%» va bastante bien para una superficie negra. |

  magick pokemon.gif \
      \( +clone -flip -fill black -colorize 65% \) -append \
      -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_colored.png

[IM Output]
Mucho mejor... ¡Ahora sí que parece un reflejo! La otra forma de debilitar un reflejo es hacer que la imagen reflejada sea semitransparente, o translúcida. Por ejemplo, multiplica el valor alfa de las imágenes para que solo sea visible alrededor del 35 % del objeto de origen. |

  magick pokemon.gif -alpha on \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_alpha.png

[IM Output]
En realidad esto es preferible, porque significa que el color de la superficie puede ser cualquier color, o incluso algún tipo de textura o patrón de color. Por ejemplo, generemos un suelo de madera horizontal usando una técnica de teselado infinito de Contemplar horizontes lejanos. |

  magick tile_wood.gif   -set option:distort:viewport 100x100 \
          -virtual-pixel tile     -distort Perspective \
                '0,0 -20,65  96,0 60,40  96,96 120,55  0,96 50,99' \
          wooden_floor.png

[IM Output]
Y ahora superpongamos nuestra imagen con su reflejo semitransparente sobre este suelo de madera. |

  magick pokemon.gif -alpha on \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      wooden_floor.png +swap \
      -gravity North -geometry +0+5 -composite  reflect_wood.png

[IM Output]
Sin el objeto reflejado, la superficie de madera parece bastante apagada y sin vida, pero con algún objeto reflejado en ella, ¡el suelo adquiere de pronto un aspecto muy pulido!

Origen distorsionado

Bien. Probemos algo un poco más elaborado y demos a la imagen algo de profundidad en perspectiva 3D. |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      +distort Perspective '0,0 0,0  0,64 0,64  64,0 54,10  64,64 54,54' \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +filter  -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_distort_bad.png

[IM Output]
Lo cual es claramente incorrecto. Parece que la imagen está distorsionada, pero sigue de frente al usuario original. ¿Por qué? Porque...

Un objeto en contacto con la superficie también estará en contacto con su reflejo.

Parece bastante obvio, pero he visto a gente equivocarse en esto. Por supuesto, si el objeto flota sobre la superficie, no habrá contacto. Una forma de arreglarlo sería distorsionar la imagen de origen y su reflejo por separado, antes de combinar las capas de los resultados. |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( -clone 0 \
         +distort Perspective '0,0,0,0  0,64,0,64  64,0,54,10  64,64,54,54' \) \
      \( -clone 0  -channel A -evaluate multiply .35 +channel \
         +distort Perspective '0,0,0,128  0,64,0,64  64,0,54,98  64,64,54,54' \
      \) -delete 0 +swap -background none  -layers merge \
      +filter  -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_distort_sep.png

[IM Output]
Como se ve por el conjunto tan distinto de parámetros de distorsión, distorsionar un reflejo puede llegar a ser muy difícil. Lo es aún más porque un simple cambio en la primera distorsión exige un cambio calculado en la segunda distorsión, la de la imagen reflejada. Hay dos reglas más que te indican cómo deben calcularse las coordenadas de la distorsión reflejada.

Los reflejos en una superficie horizontal van siempre directamente hacia abajo.

That is, a reflection is always toward the user, which as an user is directly in front of an image, will mean that any reflection in a horizontal surface will be downward, directly toward the user. This is a law of physics, and that is one thing you do not want to break, if you want your images to be at least semi-realistic. And finally one other rule that you should remember.

Las superficies verticales reflejadas en superficies horizontales tienen
reflejos de la misma altura que el objeto reflejado

No importa lo «lejano» que parezca el objeto en una imagen: en la imagen final, la altura de su reflejo debe ser la misma que la del objeto reflejado. No es evidente y es muy fácil equivocarse.

Estas tres reglas significan que el valor X de la coordenada reflejada permanece igual, mientras que el valor Y se voltea hacia abajo alrededor del «punto de contacto con la superficie», en la misma medida en que estaba por encima de ese punto.

Así, con un poco de cuidado, puedes calcular las coordenadas de distorsión del reflejo a partir de las coordenadas de la imagen de origen distorsionada. Ahora bien, estas reglas también nos dan un método para simplificar los reflejos de imágenes distorsionadas. Basta con añadir primero el reflejo a la imagen de origen y luego distorsionar la imagen de origen como si no llevara reflejo, dejando que su reflejo se distorsione junto con la imagen principal... |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +distort Perspective '0,0,0,0  0,64,0,64  64,0,54,10  64,64,54,54' \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_distort.png

[IM Output]
Como puedes ver, esto funciona mucho más fácilmente, y solo tienes un conjunto de distorsiones que manejar para el objeto, lo que también simplifica mucho los cambios. Además, te permite usar distorsiones que de otro modo sería imposible repetir para crear un reflejo aparte. Por ejemplo, generar un arco 3D a partir de la imagen... |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +distort Barrel '0,0,0,1  0,0,-.35,1.5  32,32' \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_3Darc.png

[IM Output]
Un último apunte antes de pasar a la siguiente sección... Las sombras suelen obedecer las mismas reglas que los reflejos, salvo las dos últimas. Puede que no caigan directamente hacia abajo, sino que apunten alejándose de la fuente de luz (en paralelo, para fuentes de luz lejanas). Tampoco estarán a la misma distancia del «punto de contacto con la superficie», sino que mantendrán la misma proporción de distancias, aunque no la proporción 1:1 que se obtiene con los reflejos.

Atenuación por degradado

Hasta ahora hemos trabajado con una superficie reflectante perfectamente lisa, pero la mayoría de las superficies no están pulidas hasta un brillo de espejo. Una superficie aparentemente lisa en realidad no lo es a escalas más pequeñas, y esto a su vez afecta a la luz que se refleja en ella. Ese efecto también se intensifica con la distancia que la luz reflejada debe recorrer entre el objeto y el punto de reflexión. Así que...

Los reflejos se vuelven más débiles y más distorsionados
cuanto más lejos están de la imagen de origen.

La forma más simple de crear un efecto de distancia es hacer que el reflejo sea más débil cuanto más lejos esté de la superficie. Para esto suele ser aceptable hacer el reflejo un poco más brillante cerca de la imagen. |

  magick pokemon.gif -alpha on \
      \( +clone -flip \
         -size 64x28 gradient:gray40-black   \
         -alpha off -compose CopyOpacity -composite \
      \) -append \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_attenuated.png

[IM Output]
Esto funciona razonablemente bien, y es tan fácil de generar que resulta un método bastante común para crear reflejos. La técnica funciona porque un buen porcentaje de la luz que se refleja no es un reflejo perfecto, sino más bien del entorno global. Cuanto más te alejas de la imagen original, menos parte de ella se refleja.

Atenuación por desenfoque

El componente que constituye el reflejo real del objeto de origen no se debilita simplemente con la distancia. En realidad, los reflejos se vuelven más borrosos, difusos y distorsionados con la distancia, ya que la superficie reflectante no suele ser muy lisa. No se trata de una macrodistorsión, sino de distorsiones a niveles microscópicos muy pequeños. Es el mismo efecto que produce los reflejos especulares de la luz. Es decir, cerca del origen del reflejo pueden ser razonablemente nítidos, pero cuanto más te alejas del origen, más borrosa se vuelve la imagen. Antes de la versión 6.5.5-0 de IM, esto era algo muy difícil de lograr (era posible, pero no sin muchas artimañas). Sin embargo, ahora puedes usar el mapa de desenfoque variable para desenfocar un reflejo según su distancia a la imagen de origen con bastante facilidad. No obstante, para que funcione, conviene añadir un borde transparente alrededor del objeto sobre el que extender el desenfoque. En estos ejemplos, amplié la imagen final para que se vea todo el reflejo y puedas apreciar su efecto. |

  magick pokemon.gif -alpha on \
      -background None -gravity South -extent 100x100 \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \
         -size 100x100 gradient:gray5-white \
         -compose Blur -set option:compose:args 10 -composite -compose Over \
      \) -append -trim +repage \
      -gravity North  -crop 100x140+0-5\! \
      -background black -compose Over -flatten    reflect_blurred.png

[IM Output]
El desenfoque del reflejo puede intensificarse aún más usando una elipse de desenfoque estirada verticalmente. Por ejemplo, usando argumentos de desenfoque elíptico de «10x30» en lugar de un simple desenfoque circular de «20». Si luego combinas la «atenuación por desenfoque» con una «atenuación por degradado», empezarás a obtener un reflejo muy realista de una superficie típica, no demasiado pulida pero lisa. |

  magick pokemon.gif -alpha on \
      -background None -gravity South -extent 100x100 \
      \( +clone -flip \
         \( -size 100x64 gradient:'rgba(0,0,0,0.6)-none' \
            -size 100x36 xc:none  -append \
         \) -compose Dst_In -composite \
         \( -size 100x100 gradient:gray5-white \
         \) -compose Blur -set option:compose:args 4x8 -composite \
      \) -append -trim +repage \
      -gravity North  -crop 100x140+0-5\! \
      -background black -compose Over -flatten    reflect_blur_atten.png

[IM Output]
Difícilmente conseguirás una imagen de reflejo mejor que esta para superficies planas.

Future: To add examples of...
  Surface Texture effects
    frosted - or non smooth surfaces (small scale randomised distortions)
    rippled - water reflections
        (very little blur or attenuation, just stronger macro distortion)

Piezas de rompecabezas

Una de las cosas más interesantes que me han pedido ayudar a hacer fue recortar y realzar una pieza de «rompecabezas» de forma irregular a partir de una imagen más grande. En realidad, Theo van Hoesel, también conocido como «Mr Jigsaw», quería generar muchas piezas distintas, con muchas rotaciones diferentes. Lo siguiente surgió de nuestra conversación para una sola pieza, pero con el conjunto adecuado de plantillas puede generarse cualquier patrón de piezas. A la derecha hay una miniatura enlazada a una imagen de 800x600 de una foto del Monumento al Holocausto, en Berlín, Alemania. Tomé esta foto durante mi viaje por Europa en abril de 2006. Parece una imagen estupenda para hacer un rompecabezas realmente difícil. Y debajo está la imagen de plantilla de la pieza de rompecabezas que voy a extraer de la imagen anterior. Formaba parte de un conjunto de imágenes así. El conjunto completo de piezas de rompecabezas contiene 192 máscaras de este tipo, en una matriz de 16 por 12, incluidos bordes y esquinas. Esta pieza concreta es una máscara de 100x100 píxeles , y está diseñada para usarse con un desplazamiento de +365+96 sobre una imagen de 800x600 píxeles. Estas cifras solo importan si tienes un gran conjunto de piezas distintas que encajan entre sí. Si no piensas hacerlo, por supuesto puedes usar el desplazamiento que quieras. [photo]
[IM Output]
Yo mismo he reunido varios de estos conjuntos de rompecabezas, lo que me permite hacer un rompecabezas de cualquier imagen. Y esto es exactamente lo que Theo van Hoesel hace de hecho en su sitio web. Si vas a hacer un rompecabezas real, la información de desplazamiento es muy importante, ya que identifica la ubicación y la colocación de esa pieza dentro de la imagen original. Por eso intentaré conservar esta información. Ten en cuenta que, en algunos casos, los desplazamientos de las máscaras podrían ser negativos, debido al relleno adicional alrededor de la forma, así que quizá necesites probar y ajustar los comandos de imagen para manejar esta situación. El propio relleno adicional te permitirá rotar fácilmente la imagen final y añadirle grosor y efectos de sombra, sin necesidad de cambiar el tamaño ni el desplazamiento de la pieza de rompecabezas recortada. Pero primero convirtamos esta plantilla en un contorno.
    magick jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png

[IM Output]
Luego puedo superponer esto sobre la imagen para hacerme una idea aproximada de qué se va a recortar para formar la pieza de rompecabezas. |

    magick holocaust_md.jpg \
            \( jigsaw_edge.png -negate \) -geometry +365+96 \
            -compose multiply -composite \
            -crop 100x100+365+96 +repage jigsaw_outline.png

[IM Output]
Normalmente esto no se hace al generar un rompecabezas, pero resulta útil cuando la posición de la pieza no importa (porque no forma parte de un rompecabezas mayor). En ese caso, puedes ajustar el desplazamiento para seleccionar un mejor contenido para esa pieza. | Por la forma en que funciona «[-edge](https://imagemagick.org/command-line-options/#edge)», el contorno del rompecabezas generado arriba queda dentro de la zona (blanca) enmascarada de la imagen de máscara. Esto puede ser importante si quieres aprovechar este contorno más adelante.
---|---
Bien, ya tenemos una forma de rompecabezas y un desplazamiento para la pieza que vamos a recortar. Así que recortémosla y rotémosla también. |

    magick holocaust_md.jpg \
            -crop 100x100+365+96\! -background none -flatten +repage \
            \( jigsaw_tmpl.png -alpha off \) -compose CopyOpacity -composite \
            -rotate -20 -gravity center -crop 100x100+0+0 +repage \
            jigsaw_cutout.png

[IM Output]
Ten en cuenta que recortamos la imagen de origen hasta la zona cubierta por la forma de nuestra plantilla. No necesitaremos la zona exterior a la máscara, y eliminarla pronto acelerará el procesamiento de la imagen. Fíjate también en el uso especial de un recorte por viewport, seguido de «[-flatten](https://imagemagick.org/command-line-options/#flatten)». Este método de recorte garantiza que tendremos una imagen de 100x100 píxeles de la que «recortar» la plantilla, incluso al usar máscaras de piezas de borde o esquina, y maneja además un desplazamiento negativo para las piezas situadas en el borde superior o izquierdo de la imagen, o cerca de él. La rotación también se realiza en este punto, ya que la mayoría de los realces añaden efectos según una dirección concreta. El resultado de esa rotación también se recorta por el centro, pues este operador normalmente amplía el tamaño de la imagen resultante según el ángulo de rotación usado, y no queremos que lo haga. El primer realce consiste en dar a las piezas un realce ligeramente biselado, o redondeado, alrededor de los bordes. Esto es según las superposiciones de realce con Shade, que permiten un control fino (4 factores distintos) de la forma en que se produce el realce. |

   magick jigsaw_cutout.png \
           \( +clone -channel A -separate +channel -negate \
              -background black -virtual-pixel background \
              -blur 0x2 -shade 120x21.78 -contrast-stretch 0% \
              +sigmoidal-contrast 7x50%  -fill grey50 -colorize 10% \
              +clone +swap -compose overlay -composite \) \
          -compose In -composite jigsaw_bevel.png

[IM Output]
En un rompecabezas real, este bisel es resultado del corte por prensado a máquina de las piezas. También da a las piezas una ligera hendidura, de modo que, si se vuelven a unir, todavía se ve la marca de los cortes. Ahora añadamos algo de grosor a la pieza. Esta es la mejor y más rápida forma que he encontrado, aunque no la considero una técnica muy buena. Si encuentras algo mejor, dímelo. |

   magick jigsaw_bevel.png \
           \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
           \( +clone -repage +1+2 \)  \( +clone -repage +1+3 \) \
           \( +clone -repage +2+4 \)  \( +clone -repage +2+5 \) \
          -background none -compose DstOver -flatten \
          jigsaw_thickness.png

[IM Output]
Y por último, ¿qué tal algo de sombra? |

    magick jigsaw_thickness.png \
            \( +clone   -background Black -shadow 50x3+4+4 \) \
            -background none -compose DstOver -flatten \
            jigsaw_shadow.png

[IM Output]
Todos los comandos anteriores pueden guardarse fácilmente en un único script de shell, y yo lo he hecho para mi propio uso. El script «[jigsaw](../static/img/scripts/jigsaw) » toma tres parámetros de imagen: la foto de origen, la plantilla y el destino, además de numerosas opciones para activar los distintos realces mostrados arriba. Tampoco necesita usar una forma de rompecabezas. Cualquier plantilla de máscara puede servir para recortar partes de las imágenes, con los efectos añadidos adecuados. La mayor diferencia entre lo anterior y mi versión en script es que, por defecto, el script mantiene la imagen final lo más pequeña posible, sin perder de vista el desplazamiento de la imagen recortada. Al conservar esta posición de desplazamiento, puedes usar un simple «[-mosaic](https://imagemagick.org/command-line-options/#mosaic)» o «[-flatten](https://imagemagick.org/command-line-options/#flatten)» para volver a superponer varias piezas y producir efectos interesantes (consulta el último ejemplo más abajo). Aquí tienes solo algunos ejemplos de uso de este script, de varias maneras.

    jigsaw -o +365+96 -m  null: jigsaw_tmpl.png  jigsaw_mask.png
    magick -size 800x600 xc:gray miff:- |\
                 jigsaw -r 30 -l -h -s miff:- jigsaw_mask.png jigsaw_grey.png
    jigsaw -r -60 -h -t 4 -s holocaust_md.jpg jigsaw_mask.png jigsaw_piece.png

    magick jigsaw_cnr.png -resize 50% -flip -flop -repage 120x90 \
            -background black -flatten -flip -flop jigsaw_cnr_tmpl.png
    jigsaw -t 3 -s  -r 15  -d +15+7 \
            holocaust_tn.gif jigsaw_cnr_tmpl.png   holocaust_piece_tn.png
    magick jigsaw_cnr_tmpl.png -negate png:- |\
      jigsaw -t 3 -s holocaust_tn.gif png:-   holocaust_puzzle_tn.png
    magick holocaust_puzzle_tn.png  holocaust_piece_tn.png \
            -background none  -mosaic    holocaust_jigsaw_tn.png

[IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

La última imagen es el comienzo de un posible estilo de miniatura de rompecabezas... Toma una pieza de esquina del rompecabezas y, con algo de escalado y expansión, convierte la máscara en una plantilla de máscara de imagen a tamaño completo. Luego esta se usa no solo para recortar la pieza de esquina de una miniatura existente, sino que también se invierte para generar el resto de la imagen. Al superponer estas dos imágenes se obtiene una miniatura de rompecabezas de aspecto bastante elaborado. Fíjate en el uso de «-d +15+7» en las opciones de creación de la pieza. Esto desplaza el «desplazamiento de página» de la imagen PNG generada una pequeña cantidad respecto a su posición original en la imagen, produciendo el resultado mostrado de forma simple y sencilla. Consulta el propio script para conocer las demás opciones disponibles. | _Como los desplazamientos de página generados pueden ser negativos, y podrían incluir un efecto opcional de sombra suave, se recomienda usar únicamente imágenes PNG para las piezas extraídas. Las imágenes GIF no pueden manejar desplazamientos de página negativos ni efectos de sombra, ni producen bordes suaves con antialias cuando hay transparencia de por medio.

En general, deberías evitar las imágenes GIF (y JPEG) para todo lo que no sea tu imagen final. Para más información, consulta la página de ejemplos Formatos de imagen comunes._
---|---
No te limitas a las plantillas de rompecabezas: puede usarse cualquier máscara con forma sobre cualquier imagen. Cuéntame qué se te ocurre. Aún no he terminado del todo de desarrollar el script «[jigsaw](../static/img/scripts/jigsaw)», porque me gustaría tener mejores controles para los efectos de realce, grosor y sombra, y quizá una opción de «invertir máscara». No obstante, es básicamente un programa completo y funcional que puedes usar libremente. Pon un enlace de vuelta si lo usas en una página web :-) Quienes tengáis algo de soltura con la API de PerlMagick, probad a tomar el script anterior y convertirlo a PerlMagick para ganar velocidad; luego enviádmelo para que todos los demás también puedan usarlo y sepan lo bien que manejáis IM. Las sugerencias e ideas adicionales siempre son bienvenidas.
Si lo único que quieres es recortar todas las piezas de una imagen usando una colección de máscaras (con o sin desplazamientos de píxel virtual), el siguiente comando te permitirá hacerlas TODAS muy rápidamente.

  magick mask_*.png -set filename:mask %t -alpha shape \
          null: image.jpg -compose In -layers composite \
          pieces_%[filename:mask].png

Cada una de las imágenes «pieces_mask_*.png» resultantes contiene no solo la parte correspondiente de la imagen original con el desplazamiento correcto, sino que además conserva ese desplazamiento en la imagen final. Lo consigue usando la composición multicapa para fusionar todas las imágenes situadas a la izquierda de la imagen marcadora especial «null:» con la única imagen de la derecha. Como ventaja añadida, incorpora el nombre de archivo de la máscara utilizada al nombre de archivo de la imagen de la pieza (incluido su formato de archivo de imagen final), lo que facilita mucho identificar qué pieza es cuál. (Consulta los escapes de porcentaje en nombres de archivo para más detalles. Ten en cuenta que las máscaras no tienen por qué cubrir por completo toda la imagen original, pero no deberían dejar espacios ni huecos entre las piezas. Por supuesto, para un rompecabezas correcto todas las máscaras deberían alinearse bien, de modo que produzcan un conjunto sin costuras, como el mostrado en los ejemplos de composición Dst_Out.


Efectos «gel»

Los sombreados 3D usados arriba son solo el comienzo de lo que puedes hacer con efectos de realce y sombreado. Aplicando diversos ajustes de histograma a la salida de «-shade» se abre una enorme gama de posibilidades. Uno de esos efectos que puedes reproducir es el conocido como efecto «gel», como el que se ve a menudo en los sitios web de tutoriales «Photoshop (busca en Google «Gel Effects Tutorial»). Primero creemos la forma que necesitamos. Podría ser una imagen preparada de antemano o extraída de una fuente «Dings», como hicimos con el «heart» con forma de viñeta 3D más arriba. En este caso, usemos una simple forma ovalada para un botón... |

  magick -size 100x60 xc:none \
          -fill red -draw 'circle    25,30  10,30' \
                    -draw 'circle    75,30  90,30' \
                    -draw 'rectangle 25,15  75,45' \
          gel_shape.png

[IM Output]
Ahora añadamos el nítido realce «gel» a la forma coloreada, usando una operación de sombreado desenfocado muy modificada... |

    magick gel_shape.png \
            \( +clone -alpha extract  -blur 0x12  -shade 110x0 -normalize \
               -sigmoidal-contrast 16,60% -evaluate multiply .5 \
               -roll +5+10 +clone -compose Screen -composite \) \
            -compose In  -composite  gel_highlight.png

[IM Output]
Aplicamos «-shade» a una copia del canal de transparencia (mate) tras desenfocarlo para redondearlo. Este sombreado usó una fuente de luz sin ningún ángulo de «altura» ni de «azimut», lo que básicamente significa que obtenemos un realce de color gris en un solo lado de la forma desenfocada, y negro para todo lo demás. Esta escala de grises de realce se ajustó después (se afiló) con el operador «-sigmoidal-contrast» para reducir el tamaño de la zona realzada (el nivel de umbral del «60%») y afilar sus bordes (usando un factor exponencial «16» muy alto). Con un valor exponencial tan alto, el operador actúa casi como un operador «-threshold» «difuso», para producir una región de color plana basada en la forma de la imagen original. Para más información sobre esta función suave de contraste/umbral, consulta Contraste por no linealidad sigmoidal. Y por último, el nivel del realce se ajustó con un «-evaluate» para multiplicar todos los colores por el nivel de realce deseado, y luego se usa un «-roll» para desplazar su posición hacia la zona con forma. Ahora bien, como el realce es gris sobre negro (el negro debe permanecer sin cambios), se usa una composición alfa «[Screen](compose.html#screen)» para aclarar las zonas no negras según el nivel de gris dado. Solo queda oscurecer un poco los bordes... |

    magick gel_highlight.png \
          \( +clone -alpha extract  -blur 0x2 -shade 0x90 -normalize \
             -blur 0x2  +level 60,100%  -alpha On \) \
          -compose Multiply  -composite  gel_border.png

[IM Output]
Ten en cuenta que esta vez usé un «-shade» iluminado verticalmente para oscurecer los bordes, lo que hace que las zonas que quiero conservar sin cambios queden de color blanco. Así, tras ajustar la escala de grises con un ajuste de nivel invertido y restaurar la transparencia guardada con el método de extracción alfa, pude usar una composición alfa «[Multiply](compose.html#multiply)» para oscurecer los bordes afectados. Rematemos el botón «gel» ovalado con algo de texto y efectos de sombra... |

    magick gel_border.png \
            -font Candice  -pointsize 24  -fill white  -stroke black \
            -gravity Center  -annotate 0 "Gel"  -trim -repage 0x0+4+4 \
            \( +clone -background navy -shadow 80x4+4+4 \) +swap \
            -background none  -flatten    gel_button.png

[IM Output]


Efectos «aqua» o «burbuja»

También puedes ajustar el coloreado de un «-shade» 3D completo (con una iluminación de 30 grados) para producir un efecto de agua «aqua». Sin embargo, para ello necesitamos hacer un ajuste de histograma de una forma similar a como se hace con programas gráficos con interfaz gráfica como «Gimp» o «Photoshop». Primero lo haré despacio, paso a paso, para que veas los pasos que sigo. Empecemos por crear una imagen que usar, en este caso una letra A con curvas. |

  magick -background none -fill DodgerBlue \
          -font Candice -pointsize 72  label:A  -trim +repage \
          -bordercolor None -border 1x1 \
          aqua_shape.png

[IM Output]
Ten en cuenta que añadí un borde transparente de un píxel alrededor de la imagen. Esto hace que los siguientes pasos de procesamiento resulten un poquito más fáciles. Ahora necesitamos generar el sombreado redondeado de esta imagen con forma. |

  magick aqua_shape.png \
          -alpha Extract -blur 0x8  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          aqua_shade.png

[IM Output]
La curiosa línea que trata el fondo alfa sirve para restablecer el color oculto de las zonas transparentes a un gris de tono medio, de modo que no afecte a la normalización del color. Esto puede ser muy importante. Ahora convertimos ese sombreado en un «efecto de iluminación» que se parece vagamente a la forma en que la luz se distorsiona al atravesar una burbuja de agua o de vidrio. |

  magick aqua_shade.png \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          aqua_lighting.png

[IM Output]
La función polinómica se usa para un ajuste de curvas de la imagen. Es esta función la que produce el efecto global, y puede ser difícil de determinar. Para hacerlo, pasé los puntos de control necesarios para esta «curva» al script de shell auxiliar de IM llamado «[**im_fx_curves**](../static/img/scripts/im_fx_curves)». Este devuelve entonces los «coeficientes» de la ecuación polinómica necesaria para la «curva» que se ajusta a esos puntos de control.

  im_fx_curves -c -p  0,30  100,80  50,50  80,50  > aqua_coeffs.txt

[Gnuplot] | | | [Coeffs]

El último ajuste de este efecto de iluminación consiste en oscurecer los bordes del efecto. |

  magick aqua_lighting.png \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          aqua_light+edge.png

[IM Output]
Y la superposición de sombreado está completa. Solo queda aplicarla a la imagen original, usando la composición HardLight. |

  magick aqua_shape.png aqua_light+edge.png \
          -compose Hardlight -composite   aqua_result.png

[IM Output]
Fíjate en que el color global de la imagen resultante es en realidad el color original de la forma original. De hecho, podrías incluso aplicar esto a una imagen multicolor sin ningún problema. Así que repitamos todos los pasos anteriores, incluida la creación de la imagen de forma inicial, en un solo comando.

  magick -background none -fill DodgerBlue \
          -font Candice -pointsize 96  label:'Aqua Text' -trim +repage \
          \
          \( +clone -bordercolor None -border 1x1 \
             -alpha Extract -blur 0x8  -shade 130x30 -alpha On \
             -background gray50 -alpha background -auto-level \
             -function polynomial  3.5,-5.05,2.05,0.3 \
             \( +clone -alpha extract  -blur 0x2 \) \
             -channel RGB -compose multiply -composite \
             +channel +compose -chop 1x1 \
          \) \
          -compose Hardlight -composite  aqua_text.png

[IM Output]

Si estudias lo anterior, verás que todos los pasos descritos antes se aplican para generar la imagen de iluminación, que luego se compone sobre la imagen original.


Estrellas y cometas en mosaico

Quería crear un mosaico de campos de estrellas aleatorios (con estrellas de intensidad variable) para diversos fines. Este fue el resultado de mis intentos, que fui mejorando poco a poco. Se usa una imagen de ruido aleatorio para irse adelgazando a sí misma y generar un patrón moteado. |

  magick -size 100x100 xc: +noise Random -channel R -threshold 5% \
          -negate -channel RG -separate +channel \
          -compose multiply -composite   speckles.gif

[IM Output]
Este patrón es la base de los efectos de animación de destellos, pero también el punto de partida de otros efectos. Por ejemplo, para hacer estrellas necesitamos modificar un poco más su patrón «moteado» aleatorio, de modo que resulte más realista. |

  magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
          stars.gif

[IM Output]
Ten en cuenta que no solo multiplico la máscara moteada (canal «R») sino también la imagen de intensidad de las estrellas (canal «G») dos veces. Esto produce una caída cuadrática en las intensidades de los píxeles, de manera que hay más estrellas oscuras que brillantes, igual que en el cielo nocturno real. Después agrandamos el tamaño de las estrellas según su intensidad mediante desenfoque. Esto produce un efecto similar al de las estrellas quemándose en la placa fotográfica de un astrónomo, lo que lo hace aún más realista. Cuanto mayor sea el valor de desenfoque, mayor será el efecto. Un «[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)» final devuelve los resultados a la visibilidad. Usando dos imágenes de ruido aleatorio (una para la máscara y otra para el color de las estrellas), podemos generar estrellas de colores aleatorios en lugar de simples estrellas en escala de grises. |

  magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
          -negate -channel RG -separate +channel \
          \( xc: +noise Random \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
          stars_colored.gif

[IM Output]
Sin embargo, quizá esto necesite más trabajo, ya que tendríamos que elevar al cuadrado directamente la intensidad de los colores, en lugar de limitarnos a multiplicarlos contra una distribución lineal. Aun así funciona, y proporciona un punto de partida para seguir desarrollándolo. Ten en cuenta que el color no tiene por qué ser aleatorio, sino que podría provenir fácilmente de alguna otra imagen para las estrellas. Por ejemplo, el propio color de las estrellas podría tomarse de la imagen que se vaya a usar como fondo final. Ahora que tengo un generador de campos de estrellas, puedo usar simplemente «[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)» para crear un campo de estrellas que caen. |

  magick -size 100x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -motion-blur 0x20+45 -normalize \
          star_fall.gif

[IM Output]
Por supuesto, queremos menos estrellas y una «caída» menor en las intensidades de las estrellas. Aplicando una distorsión polar a la imagen, ¡podemos hacer que los cometas vuelen o describan una espiral hacia un punto! |

  magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel Tile -background Black \
          -blur 0x.6 -motion-blur 0x15-90 -normalize \
          +distort Polar 0 +repage  star_inward.gif
  magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel Tile -background Black \
          -blur 0x.6 -motion-blur 0x15-60 -normalize \
          +distort Polar 0 +repage   star_spiral.gif

[IM Output]

[IM Output]
Aquí aplicamos un desenfoque de movimiento a las estrellas en seis direcciones (por pares) y luego las fusionamos para crear un campo de «estallidos estelares», como los que se obtienen en una lente de vidrio. |

  magick -size 100x100 xc: +noise Random -channel R -threshold .2% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile  -blur 0x.3 \
          \( -clone 0  -motion-blur 0x10+15  -motion-blur 0x10+195 \) \
          \( -clone 0  -motion-blur 0x10+75  -motion-blur 0x10+255 \) \
          \( -clone 0  -motion-blur 0x10-45  -motion-blur 0x10+135 \) \
          -compose screen -background black -flatten  -normalize \
          star_field.gif

[IM Output]
Fíjate en cómo las estrellas más oscuras solo generan un pequeño punto y apenas algo de «estallido estelar», mientras que las estrellas grandes y brillantes generan un «estallido estelar» muy grande. Ahora bien, si consigo encontrar una forma de añadir un desenfoque de tipo «sinc()» para producir también un «anillo» de destello alrededor de las estrellas más brillantes, tendremos un gran generador de campos de estrellas. Si añadimos un fondo de plasma, podemos incluso generar falsas fotografías astronómicas de nebulosas y nubes de gas. Combinando lo anterior con una animación de destellos de plasma, puedes crear un conjunto de estrellas que parezcan adornos navideños. |

  magick -size 100x100 xc: +noise Random -separate \
          null: \
            \( xc: +noise Random -separate -threshold 50% -negate \) \
            -compose CopyOpacity -layers composite \
          null: \
            plasma:red-firebrick plasma:red-firebrick plasma:red-firebrick \
            -compose Screen -layers composite \
          null:  \
            \( xc: +noise Random -channel R -threshold .08% \
              -negate -channel RG -separate +channel \
              \( +clone \) -compose multiply -flatten \
              -virtual-pixel tile  -blur 0x.4 \
              \( -clone 0  -motion-blur 0x15+90  -motion-blur 0x15-90 \) \
              \( -clone 0  -motion-blur 0x15+30  -motion-blur 0x15-150 \) \
              \( -clone 0  -motion-blur 0x15-30  -motion-blur 0x15+150 \) \
              -compose screen -background black -flatten  -normalize \) \
            -compose multiply -layers composite \
          -set delay 30 -loop 0 -layers Optimize       stars_xmas.gif

[IM Output]
La técnica anterior es solo el comienzo de lo que puede lograrse. Con algunas técnicas sencillas de animación, pueden crearse destellos y fulgores aleatorios que añadir a las imágenes. Un ejemplo simple de esto se presentó en los ejemplos de animación GIF, usando un sencillo script de shell «[star_field](../static/img/scripts/star_field) » para generar los estallidos de estrellas. ¿Qué puedes hacer con este generador de estrellas? Reto:

  • Genera destellos en lugar de estrellas. El campo moteado inicial debería estar limitado por una máscara (por ejemplo, multiplicando). Tanto los destellos como las estrellas pueden superponerse luego sobre una imagen usando la composición «screen».
  • Usa un «campo moteado» enmascarado para generar estallidos estelares que superponer. Al enmascarar las semillas en lugar del estallido estelar completo, los «rayos» de los estallidos pueden salir de la zona enmascarada y superponerse sobre otras partes de la imagen. Es decir, los rayos no quedan simplemente «cortados».
  • Crea una animación de estallidos estelares aleatorios. Esto puede exigir que animes un único campo de estallidos estelares (quizá con los rayos rotando).
  • Generando unas cuantas animaciones de estallidos estelares, puedes fusionarlas para formar una serie de estallidos estelares superpuestos desde distintas ubicaciones.
  • Encuentra un único punto «semilla» en la parte más brillante de la imagen, mediante un estiramiento de histograma y un umbralizado. Luego ve eligiendo píxeles individuales hasta que uno caiga en la zona enmascarada.
  • Crea estrellas en el borde de una forma de sombreado plano.

Si consigues alguno de los retos anteriores o usas el generador de estrellas para algún otro fin, házmelo saber a mí y al resto de la comunidad de IM.


Destellos radiales

Experimentos para generar destellos radiales. Ten en cuenta que el ancho de la imagen inicial, antes de la distorsión polar, básicamente fija el número de rayos que se producirán.

  magick -size 100x1 xc: +noise Random -channel G -separate +channel \
          -scale 100x100\!                                +write flare_1a.png \
          \( -size 100x100 gradient:'gray(100%)' -sigmoidal-contrast 10x50% \) \
          -colorspace sRGB -compose hardlight -composite  +write flare_1b.png \
          -virtual-pixel HorizontalTileEdge -distort Polar -1 \
          flare_1_final.png

[IM Output] [IM Output] [IM Output]

Fíjate en cómo uso «[+write](https://imagemagick.org/command-line-options/#write)» para guardar imágenes intermedias y mostrarlas. Esta es una técnica de depuración que se detalla en Procesamiento de imágenes complejo y depuración. Aquí tienes otro ejemplo que usa varias superposiciones para conseguir un destello de aspecto distinto. Fíjate en la técnica utilizada para generar las imágenes intermedias de depuración y de ejemplo que muestran los pasos implicados.

  magick -size 100x1 xc: +noise Random -channel G -separate +channel \
          -size 100x99 xc:black -append -motion-blur 0x35-90 \
          \( -size 100x50 gradient:'gray(0)' \
             -evaluate cos .5 -sigmoidal-contrast 3,100% \
             -size 100x50 xc:'gray(0)' -append \) \
          \( -size 1x50 xc:'gray(0)' \
             -size 1x1 xc:'gray(50%)' \
             -size 1x49 xc:'gray(0)' \
             -append -blur 0x2 -scale 100x100\! \) \
          \
          -scene 10 +write flare_2%x.png \
          \
          -background 'gray(0)' -compose screen -flatten +write flare_2f.png \
          \
          -virtual-pixel HorizontalTileEdge -distort Polar -1 \
          -colorspace sRGB flare_2_final.png

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

El gran problema de usar la distorsión polar para generar imágenes de destello es que los rayos se ensanchan con el radio, cuando en realidad lo que queremos es que mantengan un ancho más o menos constante a medida que se atenúan, o al menos que se afinen. Se agradecen ideas y orientaciones El coloreado también puede ser importante en este tipo de imágenes. Por ejemplo, aquí coloreo los tonos medios de azul. |

  magick flare_2_final.png  -fill SkyBlue  -tint 100%  flare_2_color.png

[IM Output]
El porcentaje usado en la operación «[-tint](https://imagemagick.org/command-line-options/#tint)» también puede servir para ajustar la intensidad de los rayos y del anillo del destello, aunque no cambiará mucho el núcleo blanco de la imagen. Estos ejemplos se desarrollaron más a fondo en la discusión del foro de IM Usar un destello radial como máscara.