⚠️ Este é um site de tradução não oficial, sem relação com a ImageMagick Studio LLC. Para informações oficiais, consulte a página original (https://usage.imagemagick.org/advanced/index.html).

Exemplos de ImageMagick -- Técnicas Avançadas

Exemplos de ImageMagick: Prefácio e Índice | Marcadores 3D a partir de Formas | | Usando um script para gerar enormes quantidades de imagens
Colorir e moldar uma imagem de sombreamento 3D em tons de cinza
---|---|---|---
Tornando Logotipos 3D | Usando sobreposições transparentes para colorir a imagem básica já moldada
Reflexos | Adicionando reflexos de superfície de vários tipos.
Peças de Quebra-Cabeça | Recortando e realçando uma peça de formato irregular a partir de uma foto
Efeitos "Gel" | Ajustando o tamanho, o brilho e a nitidez do realce
Clarear e escurecer usando as composições 'Screen' e 'Multiply'
Efeitos "Aqua" | Usando 'curvas' para ajustar os realces.
Estrelas e Cometas Ladrilháveis | Pontos aleatorizados.
"Meu Deus! Está cheio de estrelas! -- 2001, Uma Odisseia no Espaço"
Alargamentos Radiais | Gerando raios e anéis aleatórios em torno de um ponto central.
Esta página apresenta exemplos muito extensos, nos quais várias técnicas são combinadas para produzir efeitos compostos de manipulação de imagem, indo além das operações básicas de imagem do IM. As principais técnicas estão resumidas no índice acima. Embora muitas técnicas sejam apresentadas em outras páginas, como a criação de modelos de fonte, a rotulação elaborada de imagens e o uso de máscaras, estas páginas mostram como combinar essas técnicas para produzir um efeito mais complexo.


Marcadores 3D a partir de Formas -- Uma Abordagem por Script

Há muitas imagens de 'marcadores' disponíveis na web para listas em páginas. Mas é possível gerar seus próprios objetos 3D, o que permite fazer com que todo o site siga um estilo específico que dê unidade ao conjunto. Uma das melhores maneiras de conseguir isso é criar um script 'gerador' que produza automaticamente uma ampla variedade de botões e formas de um estilo específico, mas usando qualquer cor desejada. Este é um script desse tipo, bem simples. Aqui usa-se a opção "[-shade](https://imagemagick.org/command-line-options/#shade)" para gerar objetos de aparência 3D a partir de uma transparência de forma simples. A forma possui apenas transparência direta de liga/desliga, que é preservada com cuidado, permitindo seu uso como imagens GIF transparentes de uso geral em páginas web. A imagem 'sombreada' em tons de cinza resultante é então colorida com o operador "[-tint](https://imagemagick.org/command-line-options/#tint)", para definir os cinzas de tom médio da imagem, deixando intactos os sombreamentos mais extremos de preto e branco. Depois disso, a forma original da imagem fornecida é readicionada ao resultado colorido. Como bônus, se a imagem de entrada tinha apenas uma transparência booleana, o resultado também terá uma transparência booleana apropriada para uma imagem no 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_}

Observe que a imagem de entrada é lida apenas uma vez pelo script acima. Isso permite usar o script também em um encadeamento de comandos, empregando '-' como nomes de arquivo de entrada e de saída (talvez com uma configuração de formato de imagem do IM). Isso pode ser importante ao escrever seus próprios scripts do IM. O comando acima foi gravado em um script de shell bem simples chamado "create_bullet", e os comandos a seguir foram executados para gerar toda uma variedade de imagens de símbolos em muitas cores diferentes.

    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]

Apenas a forma ou a transparência da imagem de origem é usada na geração dos marcadores, de modo que qualquer forma pode ser utilizada. Escolha uma forma própria, exclusiva do seu site. Observe também que se pode usar GIF ou PNG, com ou sem transparência definindo a forma. O comando não faz distinção. Ao usar uma imagem maior do que a mostrada aqui, convém também aumentar a quantidade de desfoque aplicada antes da operação de sombreamento. Caso contrário, apenas as áreas próximas às bordas das imagens ficarão arredondadas. Também pode ser melhor desfocar várias vezes em vez de usar um valor de desfoque grande (para aumentar a velocidade do desfoque). É claro que, se você fizer melhorias ou tiver outras ideias, avise, para que possamos compartilhá-las com os demais.


Tornando Logotipos 3D

Neste exemplo temos um logotipo de cor plana, com uma forma difícil, que se deseja processar para dar-lhe uma aparência 3D nítida. Para isso, o logotipo é usado para gerar realces e sombras, que são convertidos em transparências para sobrepor à imagem original. São empregadas muitas técnicas diferentes, de todas as páginas de exemplo, para obter esse efeito passo a passo. Este exemplo faz uso intenso de imagens geradas pelo operador Shade e de diversos métodos de composição alfa. Recomenda-se familiarizar-se com esses operadores de imagem antes de prosseguir, ou consultá-los quando quiser entender melhor o que está acontecendo.


Antes de começar, porém, precisaremos de um logotipo simples ao qual aplicar a técnica, e de sua máscara.... Vamos primeiro criar uma forma para o fundo colorido do logotipo de exemplo... |

  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]
Agora usamos nossa máscara para recortar a cor sólida do logotipo e adicionamos algum texto para gerar um logotipo simples, de cor sólida. |

  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]


Agora vamos dar-lhe uma aparência 3D usando técnicas de realce por sobreposição. |

  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]
Adicionar sombras também ficou mais fácil graças ao novo operador de geração de sombras fornecido pelo IM. |

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

[IM Output]
Só por diversão, vamos terminar sobrepondo nosso logotipo a um fundo semelhante a 'papel rugoso'. É possível criar um enorme número de outras telas de fundo; veja os Exemplos de fundos para uma coleção desses exemplos. |

  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]


Reflexos

Reflexos são relativamente fáceis de fazer, mas muitas vezes não parece ser assim. É preciso lidar com aspectos como a cor e a textura da superfície e também com o modo como cada efeito desse tipo aumenta com a distância entre o reflexo na superfície e o objeto que está sendo refletido por ela. Basicamente, o que deveria ser uma questão relativamente simples torna-se, muito rapidamente, bastante complexa. [IM Output] Vamos então começar com o reflexo de uma imagem relativamente simples, neste caso a imagem de um personagem de Pokémon, Azumarill (veja à direita). Substitua por sua própria imagem, se quiser. Ao fazer o reflexo de um espelho perfeito, bastaria copiar e inverter o objeto de origem e adicionar algum fundo atrás dele para dar-lhe algum contexto. Por exemplo...
|

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

[IM Output]

Cor da superfície - Atenuação geral

O que se deve notar acima é que o reflexo, sendo perfeito, não se parece de fato com um reflexo em uma superfície preta. É mais como um 'ladrilho espelhado' da imagem original, o que também é verdade. Mesmo um espelho comum de banheiro não reflete toda a luz que o atinge, e ele é praticamente o melhor espelho que se pode obter. Assim, a primeira regra dos reflexos é...

Reflexos nunca são perfeitos.

Nenhum reflexo é jamais um reflexo de 100%, e por isso todos são coloridos pela superfície (ou pelo ambiente ao redor). O mundo é imperfeito, e os reflexos realçam e demonstram muito bem essas imperfeições. Vamos, então, tentar de novo, mas desta vez colorindo o reflexo com a cor da superfície refletora. Isso pode ser feito de duas maneiras. O método mais simples é apenas colorir o reflexo com a mesma cor da superfície. A quantidade de coloração depende de quão boa a superfície é em refletir; para superfícies coloridas, isso costuma ser bastante ruim, de modo que é preciso adicionar uma grande quantidade de cor. "65%" é bem adequado para uma superfície preta. |

  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]
Bem melhor... Agora sim parece um reflexo! A outra forma de tornar um reflexo mais fraco é deixar a imagem refletida semitransparente, ou translúcida. Por exemplo, multiplicando o valor alfa da imagem, para tornar visível apenas cerca de 35% do objeto de origem. |

  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]
Na verdade, isso é preferível, pois significa que a cor da superfície pode ser qualquer cor ou até algum tipo de textura ou padrão colorido. Por exemplo, vamos gerar um piso de madeira horizontal, usando uma técnica de ladrilhamento infinito de Vendo horizontes distantes. |

  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]
E agora sobrepomos nossa imagem, com seu reflexo semitransparente, a esse piso de madeira. |

  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]
Sem o objeto refletido, a superfície de madeira parece bastante apagada e sem vida, mas com algum objeto refletido nela, o piso de repente ganha uma aparência muito polida!

Origem distorcida

Certo. Vamos tentar algo um pouco mais elaborado e dar à imagem alguma profundidade em 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]
O que está obviamente errado. Parece que a imagem está distorcida, mas permanece de frente e plana em relação ao usuário original. Por quê? Porque...

Um objeto que está em contato com a superfície também estará em contato com o seu reflexo.

Parece bastante óbvio, mas já vi pessoas errarem nisso. É claro que, se o objeto estiver flutuando acima da superfície, então não haverá contato. Uma forma de corrigir isso seria distorcer a imagem de origem e o reflexo dessa imagem separadamente, antes de mesclar os resultados com mesclagem de camadas. |

  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 pode ver pelo conjunto muito diferente de parâmetros de distorção, distorcer um reflexo pode ficar muito difícil. É ainda mais difícil porque uma simples alteração na primeira distorção exige uma alteração calculada na segunda distorção, referente à imagem refletida. Há mais duas regras que indicam como as coordenadas da distorção refletida devem ser calculadas.

Reflexos em uma superfície horizontal são sempre diretamente para baixo.

Ou seja, um reflexo é sempre em direção ao usuário; como o usuário está diretamente à frente de uma imagem, isso significa que qualquer reflexo em uma superfície horizontal será para baixo, diretamente em direção ao usuário. Essa é uma lei da física, e é algo que não se deve violar, caso se queira que as imagens sejam ao menos semirrealistas. E, por fim, mais uma regra que se deve lembrar.

Superfícies verticais, refletidas em superfícies horizontais, têm
reflexos com a mesma altura do objeto refletido

Não importa quão 'distante' o objeto pareça estar em uma imagem, a altura de seu reflexo na imagem final deve ser a mesma altura do objeto que está sendo refletido! Isso não é óbvio e é muito fácil de errar.

Essas três regras significam que o valor X da coordenada refletida permanece o mesmo, enquanto o valor Y é invertido para baixo em torno do 'ponto de contato com a superfície', na mesma medida em que está acima desse ponto.

Assim, com algum cuidado, é possível calcular as coordenadas de distorção do reflexo com base nas coordenadas da imagem de origem distorcida. Essas regras também nos fornecem um método que pode simplificar os reflexos de imagens distorcidas. Basta primeiro anexar o reflexo à imagem de origem e, em seguida, distorcer a imagem de origem como se ela não tivesse nenhum reflexo anexado, deixando que seu reflexo se distorça junto com a imagem 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 se pode ver, isso funciona de forma muito mais fácil, e há apenas um conjunto de distorções a tratar para o objeto, o que também torna as alterações muito mais simples. Também permite usar distorções que, de outro modo, seriam impossíveis de repetir para criar um reflexo separado. Por exemplo, gerando um arco 3D a partir da imagem... |

  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]
Um último ponto antes de prosseguirmos para a próxima seção... As sombras geralmente obedecem às mesmas regras dos reflexos, exceto pelas duas últimas regras. Elas podem não cair diretamente para baixo, mas apontar para longe da fonte de luz (paralelas, no caso de fontes de luz distantes). Além disso, não estarão à mesma distância do 'ponto de contato com a superfície', mas terão a mesma proporção de distâncias, apenas não na proporção 1:1 que se obtém para reflexos.

Atenuação por gradiente

Até aqui lidamos com uma superfície refletora perfeitamente lisa, mas a maioria das superfícies não é polida a ponto de brilhar como um espelho. Uma superfície aparentemente lisa, na verdade, não é lisa em escalas menores, e isso, por sua vez, afeta a luz refletida por essa superfície. Esse efeito também se torna mais forte com a distância que a luz refletida precisa percorrer entre o objeto e o ponto de reflexão. Assim...

Os reflexos ficam mais fracos e mais distorcidos
quanto mais distantes estão da imagem de origem.

A forma mais simples de criar um efeito de distância é tornar o reflexo mais fraco quanto mais distante estiver da superfície. Para isso, costuma ser aceitável deixar o reflexo um pouco mais claro perto da imagem. |

  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]
Isso funciona razoavelmente bem e é tão fácil de gerar que se tornou um método bastante comum de gerar reflexos. A técnica funciona porque uma boa parte da luz refletida não é um reflexo perfeito, mas sim mais do ambiente global. Quanto mais distante da imagem original, menos da imagem original é refletido.

Atenuação por desfoque

O componente que compõe o reflexo real do objeto de origem não fica simplesmente mais fraco com a distância. Na realidade, os reflexos ficam mais borrados, difusos e distorcidos com a distância, pois a superfície refletora geralmente não é muito lisa. Isso não é uma macrodistorção, mas distorções em níveis microscópicos muito pequenos. O mesmo efeito que produz os reflexos de iluminação especular. Ou seja, perto da origem do reflexo eles podem ser razoavelmente nítidos, mas quanto mais distante da origem, mais borrada a imagem se torna. Antes da versão 6.5.5-0 do IM, isso era algo muito difícil de conseguir (era possível, mas não sem muitos truques). Agora, porém, é possível usar o mapa de desfoque variável para desfocar um reflexo com base em sua distância da imagem de origem de forma bem simples. Contudo, para que isso funcione, é uma boa ideia adicionar uma borda transparente ao redor do objeto para dentro da qual desfocar. Nestes exemplos, estendi a imagem final para que se possa ver todo o reflexo e apreciar seu efeito. |

  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]
O desfoque do reflexo pode ser realçado ainda mais usando uma elipse de desfoque esticada verticalmente. Por exemplo, usando argumentos de desfoque elíptico de '10x30' em vez de um simples desfoque circular de '20'. Se então combinar a "atenuação por desfoque" com uma "atenuação por gradiente", começará a obter um reflexo bem realista, típico de uma superfície lisa, não tão polida. |

  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]
Seria difícil obter uma imagem de reflexo melhor do que esta para superfícies planas.

Futuro: Adicionar exemplos de...
  Efeitos de textura de superfície
    fosco - ou superfícies não lisas (distorções aleatórias de pequena escala)
    ondulado - reflexos na água
        (muito pouco desfoque ou atenuação, apenas macrodistorção mais forte)

Peças de Quebra-Cabeça

Uma das coisas mais interessantes com que me pediram ajuda foi recortar e realçar uma peça de 'quebra-cabeça' de formato irregular a partir de uma imagem maior. Na verdade, Theo van Hoesel, também conhecido como "Mr Jigsaw", queria gerar muitas peças separadas, em muitas rotações diferentes. O que se segue foi desenvolvido a partir dessa conversa para apenas uma peça, mas, com o conjunto certo de modelos, qualquer padrão de peças pode ser gerado. À direita há uma miniatura vinculada a uma imagem 800x600 de uma foto do Memorial do Holocausto, em Berlim, Alemanha. Tirei esta foto durante minha viagem pela Europa em abril de 2006. Parece uma ótima imagem para fazer um quebra-cabeça realmente difícil. E abaixo dela há uma imagem de modelo da peça de quebra-cabeça que vou extrair da imagem acima. Ela fazia parte de um conjunto dessas imagens. O conjunto completo de peças de quebra-cabeça contém 192 dessas máscaras, em uma matriz de 16 por 12, incluindo bordas e cantos. Esta peça de quebra-cabeça específica é uma máscara de 100x100 pixels , projetada para ser usada em um deslocamento +365+96 sobre uma imagem de 800x600 pixels. Esses números só são importantes se você tiver um grande conjunto de peças diferentes que se encaixam. Se você não pretende fazer isso, então é claro que pode usar qualquer deslocamento que quiser. [photo]
[IM Output]
Eu mesmo colecionei vários desses conjuntos de quebra-cabeça, o que me permite fazer um quebra-cabeça de qualquer imagem. E é isso que Theo van Hoesel está de fato fazendo em seu site. Se você estiver fazendo um quebra-cabeça de verdade, então a informação de deslocamento é muito importante, pois identifica a localização e o posicionamento daquela peça em relação à imagem original. Por isso, tentarei preservar essa informação. Observe que os deslocamentos das máscaras podem, em alguns casos, ser negativos, devido ao preenchimento extra ao redor da forma, de modo que talvez seja necessário testar e ajustar os comandos de imagem para lidar com essa situação. O próprio preenchimento extra permitirá rotacionar com facilidade e adicionar efeitos de espessura e sombra à imagem final, sem precisar alterar o tamanho ou o deslocamento da peça de quebra-cabeça recortada. Primeiro, porém, vamos transformar este modelo em um contorno.
    magick jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png

[IM Output]
Posso então sobrepor isso à imagem para ter uma ideia aproximada do que será recortado para formar a peça de quebra-cabeça. |

    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 isso não é feito ao gerar um quebra-cabeça, mas é útil quando a posição da peça não é importante (por não fazer parte de um quebra-cabeça maior). Nesse caso, você pode ajustar o deslocamento para selecionar um conteúdo melhor para aquela peça. | Devido à forma como "[-edge](https://imagemagick.org/command-line-options/#edge)" funciona, o contorno do quebra-cabeça gerado acima fica dentro da área mascarada (branca) da imagem de máscara. Isso pode ser importante caso você queira aproveitar esse contorno mais tarde.
---|---
Certo, temos uma forma de quebra-cabeça e um deslocamento para a peça a recortar. Então vamos recortá-la e também rotacioná-la. |

    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]
Observe que recortamos a imagem de origem para a área coberta pela forma do nosso modelo. Não precisaremos da área fora da máscara, e removê-la cedo acelera o processamento da imagem. Note também o uso especial de um recorte por viewport, seguido de "[-flatten](https://imagemagick.org/command-line-options/#flatten)". Esse método de recorte garante uma imagem de 100x100 pixels da qual 'recortar' o modelo, mesmo ao usar máscaras de peças de borda ou de canto, e também trata um deslocamento negativo para peças nas bordas superior ou esquerda da imagem, ou perto delas. A rotação também é realizada neste ponto, pois a maioria dos realces adiciona efeitos com base em uma direção específica. O resultado dessa rotação também é recortado ao centro, pois esse operador normalmente expande o tamanho da imagem resultante, dependendo do ângulo de rotação usado, e não queremos que isso ocorra. O primeiro realce é dar às peças um realce levemente chanfrado, ou arredondado, ao redor das bordas. Isso segue as sobreposições de realce por Shade, que permitem um controle fino (4 fatores separados) da forma como o realce é produzido. |

   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]
Em um quebra-cabeça real, esse chanfro resulta do corte das peças por uma prensa de máquina. Ele também dá às peças uma leve depressão, de modo que, quando as peças são reencaixadas, ainda se percebe a marca dos cortes. Agora vamos adicionar alguma espessura à peça. Esta é a forma melhor e mais rápida que encontrei, embora eu não a considere uma técnica muito boa. Se você encontrar algo melhor, então avise. |

   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]
E, por fim, que tal alguma sombra. |

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

[IM Output]
Todos os comandos acima podem ser facilmente salvos em um único script de shell, e fiz isso para meu próprio uso. O script "[jigsaw](../static/img/scripts/jigsaw) " recebe três parâmetros de imagem: foto de origem, modelo e destino, além de inúmeras opções para ativar os diversos realces mostrados acima. Ele também não precisa usar uma forma de quebra-cabeça. Qualquer modelo de máscara poderia ser usado para recortar partes de imagens, com os efeitos adicionais apropriados. A maior diferença entre o exposto acima e minha versão em script é que, por padrão, o script mantém a imagem final o menor possível, ao mesmo tempo em que acompanha o deslocamento da imagem recortada. Ao preservar essa posição de deslocamento, você pode usar um simples "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)" ou "[-flatten](https://imagemagick.org/command-line-options/#flatten)" para sobrepor várias peças de volta e produzir efeitos interessantes (veja o último exemplo abaixo). Aqui estão apenas alguns exemplos de uso deste script, de várias maneiras.

    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]

A última imagem é o começo de um possível estilo de miniatura de quebra-cabeça... Ela toma uma peça de canto do quebra-cabeça e, com algum escalonamento e expansão, converte a máscara em uma máscara de modelo de imagem em tamanho completo. Essa máscara é então usada não só para recortar a peça de canto de uma miniatura existente, mas também é negada para produzir o restante da imagem. A sobreposição dessas duas imagens produz uma miniatura de quebra-cabeça de aparência bem elaborada. Observe o uso de um '-d +15+7' nas opções de criação da peça. Isso desloca o 'deslocamento de página' da imagem PNG gerada em uma pequena quantidade em relação à sua posição original na imagem, produzindo o resultado mostrado de forma simples e fácil. Veja o próprio script para as demais opções disponíveis. | _Como os deslocamentos de página gerados podem ser negativos e podem conter um efeito opcional de sombra suave, recomenda-se usar apenas imagens PNG para as peças extraídas. Imagens GIF não conseguem lidar com deslocamentos de página negativos nem com efeitos de sombra, e também não produzem bordas suavizadas de aparência lisa quando há transparência envolvida.

Em geral, você deve evitar imagens GIF (e JPEG) para tudo, exceto a imagem final. Para mais informações, veja a página de exemplos Formatos de imagem comuns._
---|---
Você não está limitado a modelos de quebra-cabeça; qualquer máscara com forma pode ser usada com qualquer imagem. Conte-me o que você criar. Ainda não terminei totalmente o desenvolvimento do script "[jigsaw](../static/img/scripts/jigsaw)", pois gostaria de ter melhores controles para os efeitos de realce, espessura e sombra, e possivelmente uma opção de 'negar máscara'. Mesmo assim, é basicamente um programa funcional completo que você está livre para usar. Coloque um link de volta se o usar em uma página web :-) Para quem tem alguma habilidade com a API PerlMagick, tente pegar o script acima e convertê-lo para PerlMagick por velocidade e, então, enviá-lo a mim, para que todos os demais também possam usá-lo e ver o quão bom você é em usar o IM. Mais sugestões e ideias são sempre bem-vindas.
Se você quiser apenas recortar todas as peças de uma imagem usando uma coleção de máscaras (com ou sem deslocamentos de pixel virtual), então o comando a seguir permite fazer TODAS elas muito rapidamente.

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

Cada uma das imagens "pieces_mask_*.png" resultantes contém não só a imagem apropriada da imagem original no deslocamento correto, mas também preserva esse deslocamento na imagem final. Isso é feito usando a composição multicamadas para mesclar todas as imagens à esquerda da imagem marcadora especial "null:" com a única imagem à direita. Como bônus adicional, ela incorpora o nome do arquivo da máscara usada no nome do arquivo da imagem da peça (incluindo seu formato final de arquivo de imagem), tornando muito mais fácil identificar qual peça é qual. (Veja Escapes de porcentagem em nomes de arquivo para detalhes. Observe que as máscaras não precisam cobrir completamente toda a imagem original, mas não devem deixar espaços ou lacunas entre as peças. É claro que, para um quebra-cabeça adequado, todas as máscaras devem se alinhar corretamente, de modo a produzir um todo contínuo, como mostrado nos exemplos de composição Dst_Out.


Efeitos "Gel"

Os sombreamentos 3D usados acima são apenas o começo do que se pode fazer com efeitos de realce e sombreamento. Ao fazer diversos ajustes de histograma na saída de "-shade", uma enorme variedade de possibilidades fica disponível. Um desses efeitos que se pode reproduzir é conhecido como efeito 'Gel', do tipo que se vê com frequência em sites de tutoriais do "Photoshop" (pesquise no Google por "Gel Effects Tutorial"). Primeiro vamos criar a forma de que precisamos. Poderia ser uma imagem previamente preparada ou extraída de uma fonte 'Dings', como fizemos com o marcador 3D em forma de "coração" acima. Neste caso, vamos usar uma forma oval simples para um botão... |

  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]
Agora vamos adicionar o realce 'Gel' nítido à forma colorida, usando uma operação de sombreamento desfocado bastante 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 uma cópia do canal de transparência (matte) depois de desfocá-lo para arredondá-lo. Esse sombreamento usou uma fonte de luz sem qualquer ângulo de 'altura' ou 'azimute', o que basicamente significa obter um realce de cor cinza em apenas um lado da forma desfocada, e preto para todo o resto. Essa escala de cinza de realce foi então ajustada (afinada) com o operador "-sigmoidal-contrast" para reduzir o tamanho da área realçada (o nível de limiar de '60%') e tornar suas bordas mais nítidas (usando um fator exponencial muito alto, de '16'). Com um valor exponencial tão alto, o operador quase age como um operador "-threshold" 'difuso', produzindo uma região plana de cor com base na forma da imagem original. Para mais informações sobre essa função suave de contraste/limiar, veja Contraste de não linearidade sigmoidal. E, por fim, o nível do realce foi ajustado com um "-evaluate" para multiplicar todas as cores pelo nível de realce desejado, e então um "-roll" é usado para deslocar sua posição para dentro da área com forma. Agora, como o realce é cinza sobre preto (o preto deve permanecer inalterado), uma composição alfa '[Screen](compose.html#screen)' é usada para clarear as áreas não pretas pelo nível de cinza dado. Agora só falta escurecer um pouco as bordas... |

    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]
Observe que desta vez usei um "-shade" iluminado verticalmente para escurecer as bordas, o que deixa as áreas que quero preservar inalteradas com uma cor branca. Assim, após ajustar a escala de cinza com um ajuste de nível invertido e restaurar a transparência salva pelo método de extração alfa, pude então usar uma composição alfa '[Multiply](compose.html#multiply)' para escurecer as bordas afetadas. Vamos terminar o botão 'Gel' oval com alguns efeitos de texto e 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]


Efeitos "Aqua" ou "Bolha"

Também é possível ajustar um "-shade" 3D completo (com iluminação de 30 graus) para produzir um efeito de água "Aqua". Para isso, porém, precisamos fazer um ajuste de histograma de maneira semelhante ao que se faz com programas gráficos de interface, como o "Gimp" e o "Photoshop". Farei isso primeiro devagar, passo a passo, para que você veja as etapas que estou seguindo. Primeiro vamos criar uma imagem para usar, neste caso uma letra A curvilínea. |

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

[IM Output]
Observe que adicionei uma borda transparente de um pixel ao redor da imagem. Isso torna as próximas etapas de processamento um pouco mais fáceis. Agora precisamos gerar um sombreamento arredondado dessa imagem com forma. |

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

[IM Output]
A linha curiosa que lida com o fundo alfa serve para redefinir a cor oculta das áreas transparentes para um cinza de tom médio, de modo que ela não afete a normalização de cor. Isso pode ser muito importante. Agora transformamos esse sombreamento em um 'efeito de iluminação' que se parece vagamente com a forma como a luz é distorcida por uma bolha de água ou de vidro. |

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

[IM Output]
A função polinomial, que é usada para um ajuste de curvas da imagem. É essa função que produz o efeito geral e pode ser difícil de determinar. Para isso, passei os pontos de controle necessários para essa 'curva' ao script de shell de apoio do IM chamado "[**im_fx_curves**](../static/img/scripts/im_fx_curves)". Ele então retorna os 'coeficientes' da equação polinomial necessária para a 'curva' que se ajusta a esses pontos de controle.

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

[Gnuplot] | | | [Coeffs]

O ajuste final desse efeito de iluminação é escurecer as bordas do efeito de iluminação. |

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

[IM Output]
E a sobreposição de sombreamento está completa. Só falta aplicá-la à imagem original, usando a composição HardLight. |

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

[IM Output]
Note que a cor geral final da imagem resultante é, na verdade, a cor original da forma original. De fato, você poderia até aplicar isto a uma imagem multicolorida, sem nenhum problema. Então vamos repetir todas as etapas acima, incluindo a criação da imagem de forma inicial, tudo em um único 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]

Se você estudar o exposto acima, verá que todas as etapas descritas anteriormente são aplicadas para gerar a imagem de iluminação, que é então composta sobre a imagem original.


Estrelas e Cometas Ladrilháveis

Eu queria fazer um ladrilho de campos de estrelas aleatórios (com estrelas de intensidades variáveis) para diversos fins. Este foi o resultado de minhas tentativas, aos poucos aprimoradas, nesse sentido. Uma imagem de ruído aleatório é usada para se rarefazer e gerar um padrão de pontilhado. |

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

[IM Output]
Esse padrão é a base para efeitos de animação de brilho reluzente, mas também o ponto de partida para outros efeitos. Por exemplo, para fazer estrelas precisamos modificar um pouco mais seu padrão de 'pontilhado' aleatório, para tornar as coisas mais realistas. |

  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]
Observe que multiplico não só a máscara de pontilhado (canal 'R'), mas também, duas vezes, a imagem de intensidade das estrelas (canal 'G'). Isso produz uma queda quadrática nas intensidades dos pixels, de modo que há mais estrelas escuras do que brilhantes, exatamente como no céu noturno real. Depois disso, aumentamos o tamanho das estrelas com base em sua intensidade por meio de desfoque. Isso produz um efeito semelhante ao das estrelas queimando na placa fotográfica de um astrônomo, tornando-o ainda mais realista. Quanto maior o valor de desfoque, maior o efeito. Um "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" final traz os resultados de volta à visibilidade. Usando duas imagens de ruído aleatório (uma para a máscara e outra para a cor das estrelas), podemos gerar estrelas de cores aleatórias, em vez de simples estrelas em tons de cinza. |

  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]
Isso, porém, pode precisar de mais trabalho, pois precisamos elevar ao quadrado a intensidade das cores diretamente, em vez de apenas multiplicá-las por uma distribuição linear. Ainda assim funciona e serve de ponto de partida para desenvolvimentos posteriores. Note que a cor não precisa ser aleatória, mas poderia facilmente vir de alguma outra imagem para as estrelas. Por exemplo, a própria cor das estrelas poderia ser obtida da imagem que será usada como fundo final. Agora que tenho um gerador de paisagem estelar, posso simplesmente usar "[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)" para criar um campo de estrelas cadentes! |

  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]
É claro que queremos menos estrelas e uma 'queda' menor nas intensidades das estrelas. Por meio de distorção polar da imagem, podemos fazer os cometas voarem ou espiralarem em direção a um ponto! |

  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]
Aqui aplicamos desfoque de movimento às estrelas em seis direções (em pares) e depois as mesclamos para criar um campo de 'explosões estelares', como as que se obtêm em uma lente de vidro. |

  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]
Observe como as estrelas mais escuras geram apenas um pequeno ponto e muito pouco de uma 'explosão estelar', enquanto as estrelas maiores e brilhantes geram uma 'explosão estelar' bem grande. Agora, se eu conseguir encontrar uma forma de adicionar um desfoque do tipo 'sinc()' para produzir também um 'anel' de alargamento ao redor das estrelas mais brilhantes, teremos um ótimo gerador de campo de estrelas. Adicione algum fundo de plasma e poderemos até gerar fotos astronômicas falsas de nebulosas e nuvens de gás. Combinando o exposto acima com uma animação de brilho reluzente de plasma, você pode fazer um conjunto de estrelas que parecem enfeites de Natal. |

  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]
A técnica acima é apenas o começo do que se pode alcançar. Usando algumas técnicas simples de animação, é possível criar brilhos reluzentes e alargamentos aleatórios que podem ser adicionados a imagens. Um exemplo simples disso foi apresentado nos exemplos de animação GIF, usando um script de shell simples "[star_field](../static/img/scripts/star_field) " para gerar as explosões estelares. O que você consegue fazer com este gerador de estrelas? Desafio:

  • Gerar brilho reluzente em vez de estrelas. O campo de pontilhado inicial deve ser limitado por uma máscara (por exemplo, multiplicando). Tanto o brilho reluzente quanto as estrelas podem então ser sobrepostos a uma imagem usando a composição 'screen'.
  • Usar um 'campo de pontilhado' mascarado para gerar explosões estelares para sobreposição. Mascarar as sementes, em vez da explosão estelar completa, significa que os 'raios' das explosões podem sair da área mascarada e se sobrepor a outras partes da imagem. Ou seja, os raios não são simplesmente 'cortados'.
  • Criar uma animação de explosões estelares aleatórias. Isso pode exigir animar um único campo de explosões estelares (talvez com os raios girando).
  • Gerando algumas animações de explosões estelares, você pode mesclá-las para formar uma série de explosões estelares sobrepostas a partir de locais diferentes.
  • Encontrar um único ponto de 'semente' na parte mais brilhante da imagem por meio de esticamento de histograma e limiarização. Depois, escolhendo pixels individuais até que um atinja a área mascarada.
  • Criar estrelas na borda de uma forma de sombreamento plano.

Se você conseguir realizar algum dos desafios acima ou usar o gerador de estrelas para algum outro fim, avise a mim e ao restante da comunidade do IM.


Alargamentos Radiais

Experimentos na geração de alargamentos radiais. Observe que a largura da imagem inicial, antes da distorção polar, basicamente define o número de raios que serão produzidos.

  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]

Observe como uso "[+write](https://imagemagick.org/command-line-options/#write)" para salvar imagens intermediárias para exibição. Essa é uma técnica de depuração detalhada em Processamento de imagens complexo e depuração. Aqui está outro exemplo, usando várias sobreposições para obter um alargamento com aparência diferente. Note a técnica usada para gerar imagens intermediárias de depuração e de exemplo que mostram as etapas envolvidas.

  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]

O grande problema de usar a distorção polar para gerar imagens de alargamento é que os raios ficam mais largos com o raio, quando na verdade queremos que eles mantenham uma largura aproximadamente constante à medida que ficam mais tênues, ou ao menos fiquem mais finos. Ideias e sugestões são bem-vindas A coloração também pode ser importante neste tipo de imagem. Por exemplo, aqui aplico uma coloração azul aos tons médios. |

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

[IM Output]
A porcentagem usada na operação "[-tint](https://imagemagick.org/command-line-options/#tint)" também pode ser usada para ajustar a intensidade dos raios e do anel de alargamento, embora não altere muito o núcleo branco da imagem. Estes exemplos foram aprofundados na discussão do Fórum do IM Using Radial Flare for a Mask.