⚠️ 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/thumbnails/index.html).

Exemplos do ImageMagick -- Criando Miniaturas e Molduras

Exemplos do ImageMagick, Prefácio e Índice

Armazenamento de Miniaturas

Criação Geral de Miniaturas

Outras Técnicas Não-IM |

Adicionando Enfeites

|

Técnicas de Moldura

Moldura usando Imagens de Borda

Um dos maiores usos dados ao ImageMagick é a criação de miniaturas para álbuns de fotos de família, páginas de esportes e hobbies, catálogos e assim por diante. Tipicamente para uso na world wide web ou em CDs de fotos. Esta página apresenta exemplos e técnicas usadas para gerar miniaturas.


Armazenamento de Miniaturas

Gostaria de começar por um ponto muito importante. A imagem original de câmeras de vídeo e de digitalização de fotos deve ser mantida em local seguro no formato original, de preferência um formato não-lossy (não o formato de imagem JPEG), sem qualquer modificação, redimensionamento ou outra alteração, exceto possivelmente uma mudança de nome de arquivo. Claro que uma imagem digitalizada pode ser redigitalizada, mas é muito melhor reutilizar a origem original do que refazê-la mais tarde a partir de uma cópia já degradada. Isto é MUITO importante, pois qualquer forma de modificação significa a perda de alguma informação na imagem, e fornece uma origem a partir da qual você pode retrabalhar a imagem para outros usos. A imagem original não precisa ser a sua imagem de trabalho, que pode ser redimensionada ou ter a cor ajustada para exibição; apenas certifique-se de ter a imagem salva e com backup em algum lugar seguro para uso futuro. A próxima coisa a fazer, mesmo antes de criar quaisquer miniaturas, é decidir como você quer salvar a miniatura em relação ao formato da imagem em tamanho normal e, então, manter esse esquema. Isto é especialmente importante para páginas web. Os esquemas incluem...

  • Salvar a imagem principal da foto no formato lossy JPEG no tamanho que você quer ou precisa e, então, usar o mesmo nome para a miniatura gerada, mas usando o formato de imagem GIF. Ou seja, o mesmo nome de arquivo, mas um formato e sufixo diferentes. Imagem Principal: photo_name.jpg Miniatura: photo_name.gif
  • Armazenar as miniaturas com o mesmo nome em um subdiretório chamado, por exemplo, "thumbs" ou o que for conveniente para você. Imagem Principal: photo_name.jpg Miniatura: thumbs/photo_name.jpg
  • Usar o mesmo formato da imagem original, mas com uma string extra adicionada ao nome do arquivo. Adições de string típicas incluem "_tn", "_small", "_thumb", etc... Imagem Principal: photo_name.jpg Miniatura: photo_name_tn.jpg
  • Alguma combinação dos itens acima. Não há razão pela qual você não possa salvar miniaturas em um formato de imagem diferente, com um sufixo de imagem extra anexado ao nome do arquivo, e salvá-las em um subdiretório! Imagem Principal: images/photo_name.jpg Miniatura: thumbs/photo_name.jpg.gif Isto é, na verdade, bastante comum na WWW, e já vi até os dois diretórios armazenados em máquinas completamente separadas!

O primeiro esquema pode usar "magick mogrify" para gerar todas as suas miniaturas, sem destruir a imagem original, usando uma configuração "[-format](https://imagemagick.org/command-line-options/#format)" para especificar o formato da imagem de saída. A partir do IM v3.2.0, o segundo esquema também é possível de fazer com "magick mogrify", graças à adição de uma configuração especial "[-path](https://imagemagick.org/command-line-options/#path)" que especifica um diretório diferente no qual salvar as imagens modificadas. Por exemplo, isto converte imagens JPG em miniaturas GIF em um subdiretório "thumbs" que acabou de ser criado.

  mkdir thumbs
  magick mogrify  -format gif -path thumbs -thumbnail 100x100 *.jpg

Os outros métodos exigirão que você, primeiro faça uma cópia da imagem original, antes de executar "magick mogrify", crie um script especial para processar as imagens, ou algum outro método próprio. Diversas técnicas não-IM mais simples são detalhadas no final da seção de exemplos sobre Processamento em Lote -- Sem usar "magick mogrify". Qualquer que seja o método escolhido, o importante é escolher um esquema para o armazenamento de miniaturas e, então, mantê-lo. Ao usar o mesmo esquema para todas as suas miniaturas, você pode escrever scripts em shell ou Perl para tornar fácil a geração de miniaturas e até mesmo a geração dos links HTML. Mais sobre isto adiante.

Seleção do formato da Miniatura

O formato no qual você salva uma miniatura pode fazer uma grande diferença no seu tamanho final em disco e na velocidade de download para páginas web. A esse respeito, recomendo que você estude o resumo dos vários Formatos de Arquivo Comuns. Especificamente, você deve notar...

**JPEG** comprime bem e é lossy, mas foi projetado para imagens grandes do mundo real, não para pequenas miniaturas. Ele também NÃO permite qualquer forma de transparência. Em resumo, o formato é bom para imagens grandes e ruim para miniaturas. Cuidado com os perfis (veja a próxima seção). Embora o JPG não seja recomendado para miniaturas, para visualizar imagens na WWW recomenda-se que você use uma imagem menor de 800x600 pixels, com uma porcentagem de "`[-quality](https://imagemagick.org/command-line-options/#quality)`" muito mais baixa (digamos 50 ou até 30%), embora não fique com boa aparência. Também foi sugerido que usar "`[-sampling-factor](https://imagemagick.org/command-line-options/#sampling-factor) 2x1`" também produzirá um tamanho de imagem JPEG menor. Recomendo que a imagem original completa nunca seja colocada diretamente na web, a não ser temporariamente (em um local referenciado) para um amigo baixar. Lembre-se de não criar link para ela (nem mesmo por indexação de diretório) e nunca por mais de um dia, ou ela poderá ser indexada pelo Google.
 **GIF** funciona para imagens pequenas e simples e comprime razoavelmente. Tem um limite de 256 cores, mas para imagens pequenas isto raramente é perceptível. Também pode fazer animações estilo desenho animado das imagens, não que isso seja necessário para miniaturas, a menos que você realmente queira caprichar. O que é um problema é que o formato só tem transparência booleana (ligado/desligado), o que resulta em bordas de aparência horrível em imagens modeladas. As soluções para isso são projetar a miniatura para usar apenas transparência booleana, ou organizá-la de modo que só possa ser usada sobre uma cor de fundo específica. Para detalhes, veja os exemplos sobre [GIFs sobre uma cor de fundo ou padrão](formats.html#bgnd). 
 **PNG** é o formato moderno ideal para miniaturas. Tem uma boa compressão e estilos de formato internos. É não-lossy e pode exibir todas as cores, e atualmente é compreendido por quase todos os navegadores (embora, para o Microsoft Internet Explorer anterior à v7, seja necessário adicionar algum java scripting às páginas web). Mais importante, este formato compreende a cor semitransparente, tornando sombras e bordas nítidas e claras, ou desbotadas e desfocadas, como você desejar. Este formato, no entanto, não faz animações, embora o formato relacionado MNG faça. Muito poucos navegadores parecem suportar esse formato, contudo. Para miniaturas, você pode reduzir o tamanho da imagem final reduzindo a profundidade e o número de cores, bem como definindo uma qualidade de compressão "`bzip`" mais alta (primeiro dígito em "`[-quality](https://imagemagick.org/command-line-options/#quality)`") para a sua imagem de miniatura final. Por exemplo, o seguinte é sugerido para pequenas miniaturas PNG que não envolvam transparência.


        -strip  -quality 95  PNG8:thumbnail.png

O que usa um formato PNG menor, de 8 bits, ou limitado a 256 cores. Você também pode reprocessar a imagem final por meio de aplicações secundárias (Veja Processamento PNG Não-IM), que podem encontrar automaticamente a melhor compressão PNG para aquela imagem específica. Também há programas para fazer essa redução de cores para o formato PNG interno menor, preservando as cores semitransparentes. Isto é algo que o IM atualmente não trata. . Uma última palavra sobre formatos... Não importa qual formato você use para as suas miniaturas, se você precisar salvar uma imagem intermediária inacabada, use um formato de imagem PNG (sem qualquer redução de cores) ou MIFF. Fazer isto preservará o máximo possível de informação de cor sobre a imagem no estágio intermediário. Só faça a redução de cores, ou salve nos formatos GIF ou JPEG, como um passo absolutamente final. Isto é importante, por isso repito...

NÃO use JPEG, PNG8 ou GIF para imagens de trabalho intermediárias!
É melhor usar PNG ou MIFF.

Perfis, Remoção e Tratamento de JPEG

Muitas imagens de câmeras digitais, softwares de digitalização e alguns programas de pintura (o photoshop é notório por isto) salvam informações extras sobre a imagem na forma de perfis. Isto inclui formatos de imagem como JPEG, PNG, TIFF e, a partir do IM v6.2.4-1, GIF. Claro que o formato específico do IM, o MIFF, também faz isto. (Veja Perfis de Imagem para informações mais detalhadas). Esses perfis podem chegar a 60 Kb de tamanho, portanto podem fazer uma grande diferença no tamanho do seu arquivo, e por padrão o IM preservará essa informação de perfil. As miniaturas não têm necessidade desses dados e, frequentemente, nem mesmo a imagem principal precisa deles. Você também pode remover os perfis das suas imagens com os comandos do IM...

  magick input.jpg  -strip output.jpg

  magick mogrify -strip  *.jpg

Você também pode usar a opção "[-profile](https://imagemagick.org/command-line-options/#profile) '*' " para remover os perfis. Recomenda-se, no entanto, que você só remova os perfis quando modificar uma imagem, especialmente ao reduzir o seu tamanho para exibições web, ou imagens de miniatura. Remover perfis durante o redimensionamento, particularmente para gerar imagens de miniatura menores, é tão comum que tanto "[-resize](https://imagemagick.org/command-line-options/#resize)" quanto "[-strip](https://imagemagick.org/command-line-options/#strip)" foram combinados em uma nova operação, justamente para esse fim. Naturalmente, essa operação de redimensionamento chama-se "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)". Por exemplo...

  magick -define jpeg:size=240x180 image.jpg -thumbnail 120x90 thumbs/image.gif

  magick mogrify -path thumbs -format gif -define jpeg:size=240x180 -thumbnail 120x90 '*.jpg'

| Antes do IM v6.5.4-7, o "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)" removia TODOS os perfis da imagem, incluindo os perfis de cor ICC. A partir desta versão, os perfis de cor serão preservados. Se o perfil de cor não for desejado, então "[-strip](https://imagemagick.org/command-line-options/#strip)" todos os perfis.
---|---
O "[magick mogrify](basics.html#mogrify)" gerará, é claro, miniaturas para um diretório inteiro de imagens JPEG, mas tenha cuidado para que ele não sobrescreva quaisquer miniaturas que você queira manter. Para vários outros métodos não-IM para percorrer um grande número de imagens, veja a seção de exemplos sobre Processamento em Lote -- Sem usar Mogrify. Para imagens muito grandes, o operador de redimensionamento "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)" vai além e primeiro reduz a imagem para 5 vezes o tamanho final da miniatura, antes de fazer a operação de redimensionamento propriamente dita. Isto acelera ainda mais a geração de miniaturas. Contudo, para gerar miniaturas de imagens JPEG, pode-se usar um método ainda melhor de limitar o tamanho inicial da imagem, simplesmente não lendo a imagem inteira para a memória em primeiro lugar. A configuração "[-define](https://imagemagick.org/command-line-options/#define) jpeg:size=" (como mostrado no exemplo acima) é uma dica especial para a biblioteca de imagens JPEG reduzir a quantidade de dados lida de imagens JPEG MUITO GRANDES. Veja Lendo Arquivos JPEG. | _Antes do IM v6.5.6-0, essa configuração do coder era extraída da configuração "[-size](https://imagemagick.org/command-line-options/#size)". Isto causava problemas quando os usuários usavam "[-size](https://imagemagick.org/command-line-options/#size)" para a criação de imagens, mas depois a leitura de JPEG produzia resultados inesperados. Por isso, isto foi alterado para ser uma configuração especial do coder.

Em versões mais antigas do IM, talvez você precise redefinir a configuração usando "[+size](https://imagemagick.org/command-line-options/#size) antes de ler imagens JPEG, por causa deste papel 'duplo'._
---|---
A partir do IM versão 6.2.6-2, foi adicionado um novo Modificador de Leitura de Imagem, que permite redimensionar a imagem de entrada imediatamente após ela ser lida. Esta opção funcionará com QUALQUER formato de imagem, não apenas com imagem JPEG. Ela não é, no entanto, um substituto para o uso de uma configuração "[-define](https://imagemagick.org/command-line-options/#define) jpeg:size=" para imagens JPEG. Assim, a maneira recomendada de redimensionar QUALQUER formato de imagem de entrada é agora...

  magick -define jpeg:size=240x180 input.img'[120x90]' \
          -strip  output_thumbnail.gif

Bem, vamos aos exemplos práticos de miniaturas com o IM...


Criação Geral de Miniaturas

Gerar Miniaturas em Geral (altura específica)

Vamos converter com magick uma imagem JPEG de exemplo grande numa miniatura GIF com 90 pixels de altura, com a largura ajustada automaticamente (dentro do limite de 250 pixels de largura) para preservar a proporção da imagem. |

  magick -define jpeg:size=500x180  hatching_orig.jpg  -auto-orient \
          -thumbnail 250x90   -unsharp 0x.5  thumbnail.gif

[IM Output]
Note que usei a opção "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)" acima. Esta não só redimensiona a imagem, como também remove qualquer informação de perfil e comentário que possa estar presente na imagem JPEG original. Além disso, como usa o operador de redimensionamento "[-sample](https://imagemagick.org/command-line-options/#sample)" para a redução inicial da imagem, é mais rápida, produzindo ao mesmo tempo resultados razoáveis para miniaturas pequenas. Também defini um mínimo "[-define](https://imagemagick.org/command-line-options/#define) jpeg:size=" para a imagem a ser lida. Isto é passado à biblioteca JPEG, que devolverá uma imagem com um tamanho algures entre este tamanho e o dobro dele (se possível), em vez de toda a imagem original muito grande. Basicamente, não sobrecarregue a memória do computador com uma imagem enorme quando isso não é necessário. A dica de tamanho JPEG que uso é pelo menos o dobro da miniatura final, para que o redimensionamento ainda gere um resultado com aspecto razoável. O operador "[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)" garante que a imagem, se vier de uma câmara digital, seja rotacionada corretamente de acordo com a orientação da câmara. Isto não é necessário para a imagem de 'desktop' que estou a usar, mas incluí-o acima para os utilizadores de câmaras digitais. Note, contudo, que a orientação ainda pode ficar errada, especialmente em fotos tiradas diretamente para baixo ou para cima, como ao fotografar documentos.O resultado é uma miniatura de altura específica, mas de largura variável. Uso esta miniatura nas minhas próprias páginas web, para que uma série de imagens numa fila fiquem todas alinhadas em altura, formando um aspecto arrumado. O limite de 250 pixels de largura acima é importante. Se ficar por definir (por exemplo: usando "-thumbnail x90"), o IM poderia ter problemas ao gerar miniaturas de imagens muito compridas e finas, como as mostradas em Imagens de Linhas Web. O resultado nesse caso seria uma ampliação muito muito comprida da imagem, em vez de uma pequena miniatura. Algumas pessoas (incluindo eu próprio) acham que, embora o redimensionamento do IM seja uma das melhores implementações (ver Redimensionamento do IM vs Outros Programas), o resultado continua um pouco desfocado. Assim, pode melhorar o resultado acima nitidificando ligeiramente a imagem (usando "[-unsharp](https://imagemagick.org/command-line-options/#auto-orient)") após a operação de redimensionamento "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)". Para mais informações ver Nitidificar Imagens Redimensionadas -- Técnica de Redimensionamento do Photoshop, mas na verdade tudo se resume a uma questão de gosto pessoal.
A versão "magick mogrify" é igual ao comando "magick" (sem imagens de entrada iniciais), mas gerará miniaturas automáticas de todas as imagens JPEG no diretório atual. O argumento de imagem é colocado entre aspas para que o próprio IM percorra o diretório, e não a shell da linha de comando. Isto evita 'erros de estouro do limite de linha' em diretórios que contêm um número enorme de imagens.

  magick mogrify  -format gif -define jpeg:size=500x180 -auto-orient \
                -thumbnail 250x90 -unsharp 0x.5  '*.jpg'

| _Note que "magick mogrify" criará miniaturas cegamente, substituindo quaisquer imagens existentes com o mesmo nome. Imagens GIF neste caso. Recomenda-se sempre extrema cautela ao usar este comando.

Recomenda-se sempre fazer cópias de segurança antes de realizar qualquer processamento.
---|---
| _Em vez de especificar um formato diferente (usando "[-format](https://imagemagick.org/command-line-options/#format)") de modo a impedir que "magick mogrify" sobrescreva as imagens de origem originais, pode usar uma definição "[-path](https://imagemagick.org/command-line-options/#path)" para definir um diretório de miniaturas separado. Pode usar ambas as opções de saída.

---|---
Embora "magick mogrify" possa gerar as novas imagens com um sufixo diferente ("[-format](https://imagemagick.org/command-line-options/#format)") ou diretório ("[-path](https://imagemagick.org/command-line-options/#path)"), essas são as suas únicas opções ao usar este comando. Se também pretender mudar o nome da imagem, como acrescentar um "_tn" ou "_sm" para denotar versões em miniatura ou pequenas da imagem, então recomendo que crie um script de shell para fazer o trabalho por si, processando-as uma de cada vez usando "magick". Escrevi um script deste tipo para fazer isto, gerando simultaneamente índices HTML ao mesmo tempo.

Redimensionar Miniatura para Ajustar

Outra forma de geração automática de miniaturas é encolher a imagem para caber numa caixa de tamanho fixo, por exemplo "100x100", mas mantendo a proporção da imagem. Bem, esse é o significado padrão de uma definição de geometria de redimensionamento. Contudo, prefiro não ampliar imagens que já cabem nessa caixa. Para isso é preciso acrescentar um ">" à string de geometria. |

  magick -define jpeg:size=200x200 hatching_orig.jpg \
          -thumbnail '100x100>' rectangle.gif

[IM Output]
Tal como antes, a proporção da imagem é preservada, pelo que é improvável que a miniatura seja exatamente 100 pixels quadrados. No entanto, pelo menos uma das dimensões da imagem terá 100 pixels.

Preencher a Miniatura

O pedido seguinte mais comum é gerar miniaturas que preenchem a imagem com bordas de uma cor específica (normalmente 'black' ou 'transparent', mas para estes exemplos usarei 'skyblue') para que a miniatura tenha exatamente o tamanho pretendido. Por exemplo: uma imagem de 400x300 pixels encolhida para caber numa caixa de 100x100 pixels terá normalmente (com o método acima) um tamanho de 100x75 pixels. Queremos acrescentar algumas bordas de preenchimento na parte superior e inferior da imagem (e também nas laterais, para garantir) para tornar a miniatura final sempre com 100x100 pixels de tamanho. Há várias formas de o fazer e, a partir do IM v6.3.2, a melhor forma é usar o Operador Extent. |

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -background skyblue -gravity center -extent 100x100 pad_extent.gif

[IM Output]
A partir da versão IM 6.2.5, também pode usar um Recorte por Viewport e achatar o resultado sobre uma cor de fundo. |

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -gravity center  -crop 120x120+0+0\! \
          -background skyblue  -flatten    pad_view.gif

[IM Output]
A diferença fundamental entre usar Extent e um Recorte por Viewport é se pretende uma Tela Virtual mínima ou ter toda a área 'preenchida'. Outro método para preencher uma imagem é sobrepor a miniatura numa imagem de fundo (imagem real, cor sólida ou tela em mosaico) do tamanho correto, neste caso a imagem interna "granite:" de 128x128. |

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          granite: +swap -gravity center -composite pad_compose.gif

[IM Output]
Este método é provavelmente o melhor a usar com versões mais antigas do IM (como o IM v5), embora a operação "[-composite](https://imagemagick.org/command-line-options/#composite)" tenha de ser feita pelo comando "[composite](basics.html#composite)" separado, em vez do método de comando único acima. Contudo, do ponto de vista do processamento de imagem, todos os métodos acima estão na realidade a fazer a mesma coisa.

Cortar a Miniatura para Ajustar

Uma alternativa, em vez de preencher a imagem para caber no tamanho de miniatura específico que queremos, é antes cortar as partes da imagem que não cabem no tamanho final. Claro que isto significa que perde de facto algumas partes da imagem original, particularmente as bordas da imagem, mas o resultado é uma miniatura ampliada da parte central da imagem. Esta é normalmente (mas nem sempre) o assunto principal da imagem, pelo que é um método prático de criação de miniaturas. A partir do IM v6.3.8-3 foi acrescentada a flag especial de opção de redimensionamento '^' para facilitar isto. Basta redimensionarmos usando esta flag e depois recortar as partes da imagem que excedem o tamanho pretendido. |

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 100x100^ \
          -gravity center -extent 100x100  cut_to_fit.gif

[IM Output]
Como pode ver, a miniatura da imagem é muito maior e mais detalhada, mas ao custo de cortar as laterais da imagem original. Para mais informações sobre esta opção ver Redimensionar para Preencher a Área Dada. | Antes do IM v6.3.8-3, quando esta flag especial foi acrescentada, teria sido necessária alguma trapaça bastante complexa para obter o mesmo resultado. VerRedimensionar para Preencher um Espaço Dado para detalhes.
---|---

Tamanho de Miniatura por Ajuste de Área

Os dois últimos métodos muitas vezes tornam a imagem muito pequena com bastante preenchimento extra, ou cortam grande parte da imagem de modo a preencher completamente o espaço. Contudo, usando uma flag de redimensionamento diferente, é possível obter uma miniatura que fica entre estes dois extremos. Por exemplo, uma miniatura de 100x100 pixels tem 10.000 pixels. Ora, se pedirmos ao redimensionamento para dimensionar a imagem para algo em torno desse número de pixels (usando a flag '@' do redimensionamento), obterá uma imagem que precisará de um pouco de preenchimento e de um pouco de corte. Isto maximiza o tamanho da miniatura resultante, sem cortar demasiado. Por exemplo... |

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 10000@ \
          -gravity center -background skyblue -extent 100x100  area_fit.gif

[IM Output]
Como pode ver, a miniatura tem algum preenchimento e a imagem tem algum recorte, mas o resultado é provavelmente o melhor ajuste possível da imagem a um dado espaço de miniatura.

Resumo do Ajuste a um Espaço Dado

Em resumo, aqui estão os resultados dos três métodos para criar a miniatura de uma imagem numa área de tamanho específico. Os três métodos usam exatamente o mesmo código, apenas com uma pequena alteração no argumento/flag de redimensionamento utilizado. [IM Output]
Ajuste com Preenchimento
redimensionar, sem flag | [IM Output]
Ajuste por Área
redimensionar, flag '@' | [IM Output]
Cortar para Ajustar
redimensionar, flag '^'
---|---|---

Preenchimento e Recorte Quadrados

Os métodos de preenchimento e recorte acima assumem que conhece o tamanho final da área na qual quer que a imagem caiba. Mas nem sempre é esse o caso. Por vezes quer simplesmente 'quadrar uma imagem', seja 'preenchendo-a' (quadrado externo) ou 'aparando' as bordas (quadrado interno). Dos Fóruns de Discussão do IM sobre Quadrar Imagens foram desenvolvidos vários métodos. A quadratura externa pode ser feita usando Mosaic para criar uma tela de fundo maior usando uma cópia rotacionada da imagem. |

  magick thumbnail.gif \
          \( +clone -rotate 90 +clone -mosaic +level-colors white \) \
          +swap -gravity center -composite    square_padded.gif

[IM Output]
A quadratura interna, por outro lado, é um pouco mais difícil e requer mais trabalho para se conseguir. Esta usa um manuseamento pesado de máscaras para gerar uma tela mais pequena. |

  magick thumbnail.gif \
          \( +clone +level-colors white \
             \( +clone -rotate 90 +level-colors black \) \
             -composite -bordercolor white -border 1 -trim +repage \) \
          +swap -compose Src -gravity center -composite \
          square_cropped.gif

[IM Output]
Uma forma alternativa é usar um distort sem efeito, usando um recorte/preenchimento por viewport de distort na imagem (Ver Recorte Quadrado Centrado por Viewport de Distort). Essencialmente usa 'escapes de percentagem' para fazer os cálculos necessários para uma operação do tipo Extent. Quadrado externo (preenchimento)... |

  magick thumbnail.gif  -virtual-pixel white -set option:distort:viewport \
     "%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_external.gif

[IM Output]
A definição Pixel Virtual é usada para especificar a cor de preenchimento. Quadrado interno (recortado)... |

  magick thumbnail.gif   -set option:distort:viewport \
     "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_internal.gif

[IM Output]
Cortesia da Página Tidbits de Fred Weinhaus. Esta é uma versão mais simples, mas perde quaisquer metadados (como strings de comentário ou perfis) que a imagem possa ter. |

  magick thumbnail.gif -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' \
          xc:none +swap -gravity center -composite square_internal_2.gif

[IM Output]
| O IMv7 permitirá fazer os cálculos acima diretamente como parte de um argumento de crop ou extent, o que evitará a perda de metadados da imagem.
---|---

Recorte Manual

A forma normal como gero imagens em miniatura para uso nas minhas páginas web é uma mistura de scripts automáticos e manuais. A configuração final das minhas imagens é a seguinte..

  • Uso um PNG ou TIFF para a digitalização original, MUITO grande, da foto. OU a imagem JPEG original transferida de uma câmara digital. Basicamente, para a imagem de origem original não modificada, para arquivo. Agora também gosto de incluir a string "_orig" no nome de ficheiro desta imagem.
  • Um formato de imagem JPEG mais pequeno para uma imagem visualizável na web quando se clica ou seleciona a miniatura. Esta imagem é redimensionada para caber numa caixa de 800x800 pixels, que é um tamanho adequado para visualização pela maioria dos utilizadores web. Normalmente acrescento um "_md" para imagem de tamanho médio, no nome do ficheiro.
  • E por fim uma miniatura GIF redimensionada para uma altura fixa de 90 pixels e largura variável. Isto permite que filas centradas de miniaturas nas páginas web tenham um aspecto razoavelmente arrumado e limpo, mas que preencham automaticamente a largura da janela do navegador, independentemente do tamanho de navegador que estejam a usar. Mais uma vez, normalmente incluo agora um "_tn" no nome de ficheiro da imagem, para denotar que é uma miniatura.

Primeiro gero as imagens JPEG visualizáveis na web (tamanho médio) usando "magick mogrify" a partir da imagem digitalizada original. Isto reduz o tempo de transferência e o tamanho de visualização da imagem para algo prático para o utilizador web típico (que poderia estar ligado via modem). A partir destas imagens gero um conjunto inicial de miniaturas, novamente usando "magick mogrify". Contudo, em fotos típicas verifico muitas vezes que o assunto das miniaturas fica demasiado pequeno para constituir uma miniatura eficaz, quando visualizado. Para corrigir isto examino as miniaturas geradas automaticamente e, em cerca de metade dos casos, crio manualmente a minha própria miniatura 'com zoom no assunto'. Leio a imagem JPEG e recorto-a até ao assunto principal da imagem, dando efetivamente 'zoom' no assunto da foto e removendo a maior parte do contexto de fundo da imagem. Isto é depois suavizado e transformado em miniatura, seja usando um "magick -thumbnail" ou, mais frequentemente, no mesmo programa gráfico com que estou a visualizar e recortar as imagens (normalmente o "XV", ver abaixo). Portanto, em vez de uma miniatura onde as pessoas na foto mal se veem (à esquerda), recortei manualmente em torno do assunto, realçando o ponto principal da foto (à direita), antes de criar a miniatura. Isso permite aos utilizadores ver o conteúdo da imagem mais claramente e assim decidir melhor se realmente querem transferir e ver a versão JPEG maior da imagem. Queensland KiteFlyers, Ron and Val Field

[IM Output]
Miniatura
Gerada
Automaticamente | | [IM Output]
Miniatura Recortada
Manualmente e
Redimensionada
(Clique em qualquer das imagens para ver a foto digitalizada original)
Isto é, claro, mais trabalhoso, mas só precisa de ser feito uma vez por imagem, e apenas em imagens que têm muito espaço, como no exemplo acima. Além disso, só faço isto para imagens que vou pôr na web. Claro que, como "magick mogrify" sobrescreverá quaisquer miniaturas existentes, possivelmente geradas à mão, não pode usá-lo novamente depois de fazer qualquer geração manual de miniaturas. O comando "magick mogrify" é útil, mas também muito perigoso, pois sobrescreve muitas imagens. Pense sempre antes de executar "magick mogrify" globalmente em todas as suas imagens.

Páginas HTML de Miniaturas

Uma vez organizadas todas as imagens em miniatura no diretório, uso um script perl especial chamado "thumblinks" que escrevi, que procura as imagens (fotos JPEG e miniaturas GIF) e gera ligações HTML, e até páginas de fotos HTML completas. O script lê e inclui o tamanho da miniatura GIF no HTML, e anexa ficheiros de cabeçalho e rodapé previamente preparados em torno das ligações das miniaturas. O script também remove quaisquer ligações de miniaturas da lista que gera, se encontrar uma ligação existente no próprio ficheiro de cabeçalho ou rodapé. Isto pode parecer complexo, mas torna a minha geração de páginas HTML muito rápida e flexível, e garante que TODAS as imagens em miniatura de um diretório foram acrescentadas à página de índice desse diretório, permitindo-me ainda comentar imagens específicas no cabeçalho do índice. Também torna a página independente do tamanho da janela do utilizador, ajustando-se automaticamente para o efeito. Para um exemplo simples da saída do meu script "thumblinks", ver Tomb of Castle Artworks. Para um exemplo rápido e ponto de partida para gerar tais ligações, veja os exemplos de uso do comando identify.

Miniatura de Ligação de Página Web FavIcon

O ícone "favion.ico" é muitas vezes procurado pelos navegadores web na página web de nível superior de um site, para todo esse site. Essa imagem é um formato de imagem multirresolução especial e pode ser criada da seguinte forma.

  magick image.png -alpha off -resize 256x256 \
          -define icon:auto-resize="256,128,96,64,48,32,16" \
          favicon.ico

O 'image.png' pode ser o que quiser, mas deve ser quadrado. Se não for, isso também deve ser o primeiro passo do processo acima. Também pode incluir resoluções maiores, como 128 ou 256 pixels, mas poucos navegadores as utilizariam. Os tamanhos de 16 e 32 pixels são muito mais usados nesses ficheiros ICO, pelo que dar-lhes ênfase especial pode ser útil. Lembre-se também de que muitos navegadores reduzem as cores das imagens para diminuir o espaço usado para as armazenar no ficheiro de marcadores do utilizador. Isto leva-nos a mais um ponto. Como normalmente só as imagens mais pequenas são usadas, com redução adicional de cores, recomenda-se manter as imagens tão pequenas e bem definidas quanto possível. Aqui está um exemplo de redimensionamento manual de imagens para um formato de ficheiro ICO.

  magick image.png  -background white \
          \( -clone 0 -resize 16x16 -extent 16x16 \) \
          \( -clone 0 -resize 32x32 -extent 32x32 \) \
          \( -clone 0 -resize 48x48 -extent 48x48 \) \
          \( -clone 0 -resize 64x64 -extent 64x64 \) \
          -delete 0 -alpha off -colors 256 favicon.ico

Como mencionado, geralmente só é usada a imagem "favion.ico" encontrada no diretório de nível superior de um site, mas também pode especificar a localização da imagem em miniatura da ligação acrescentando a seguinte tag HTML aos cabeçalhos das suas páginas...

  <LINK REL="icon" HREF="/path/to/favicon.ico" type="image/x-icon">
  <LINK REL="shortcut" HREF="/path/to/favicon.ico" type="image/x-icon">

O "/path/to/favicon.ico" pode ser um URL/URI absoluto ou parcial para a localização de onde o navegador deve obter a imagem em miniatura das páginas web. O uso de 'REL="shortcut"' é específico do Internet Explorer (antes do IE9) e não faz oficialmente parte da especificação HTML. É possível fundir as duas tags HTML numa só usando 'REL="shortcut icon"', no entanto, ao manter as tags separadas pode usar um formato de ficheiro de imagem não-ICO (como SVG) para navegadores não-IE, como o firefox. Lembre-se de que, se este elemento html não for usado, é usado em vez disso o ficheiro "favicon.ico" encontrado no diretório de nível superior do site (se presente). O formato de imagem ICO é universalmente compreendido por todos os navegadores modernos. Todos exceto o Internet Explorer também podem usar os formatos de ficheiro de imagem JPEG, PNG e GIF para a miniatura da ligação. Alguns como o FireFox conseguem até usar GIFs animados ou formatos de ficheiro de imagem SVG. Contudo, como estes últimos formatos normalmente não conseguem conter várias imagens em diferentes resoluções e contagens de cores, é provavelmente melhor manter-se no formato de ficheiro ICO para a imagem "favion.ico".


Outras técnicas não-IM

O programa "XV" que uso para processamento manual de imagens também gera imagens em miniatura, num subdiretório chamado ".xvpics". O formato das imagens nesse diretório é o formato de miniatura especial próprio do programa (ignorando o sufixo do nome de arquivo nesse diretório). Essas miniaturas são limitadas a 80x60 pixels, portanto têm um tamanho um pouco "pequeno" (a menos que se faça um hack no "xv" para usar miniaturas maiores -- veja o link abaixo). O IM entende o formato de miniatura do "xv" (que é baseado no formato de imagem "NetPBM"), então é possível gerar todas as miniaturas rapidamente com o XV e, em seguida, converter com o magick as miniaturas XV das imagens JPEG em imagens GIF para processamento posterior...

   xv -vsmap &               # gera miniaturas com o botão "Update"
   rm .xvpics/*.gif          # apaga as miniaturas XV das miniaturas "gif" existentes
   magick mogrify -format gif .xvpics/*.jpg
   mv .xvpics/*.gif .        # move as novas miniaturas "gif" para o diretório original

Se você está cansado do tamanho pequeno das miniaturas XV, particularmente com os monitores modernos maiores, pode fazer um hack no código do XV. Veja minhas notas de modificação do XV, que permitem fazer o XV usar um tamanho de miniatura maior. Eu mesmo uso miniaturas de 120x90 pixels.


Processamento adicional -- Adicionando adornos

O que foi visto acima é apenas o começo do que se pode fazer para tornar as miniaturas mais interessantes. Além da imagem em miniatura básica, é possível adicionar bordas e rotações, até mesmo com alguma seleção aleatória de estilo, para tornar a galeria de miniaturas ainda mais interessante. Acréscimos às miniaturas como esses são o que chamo de 'adornos' (fluff), como os fiapos extras que se encontram cobrindo as roupas depois de lavá-las. Ou seja, adiciona extras desnecessários à miniatura, mas que podem tornar páginas web e imagens de índice ainda mais interessantes. Fique avisado de que muitos dos métodos e processamentos a seguir são muito complexos e podem exigir um conhecimento mais profundo das várias opções de processamento de imagem do ImageMagick.

Adicionando rótulos à imagem

Durante a criação da miniatura, também é possível adicionar rótulos acima, abaixo ou até mesmo sobre a miniatura. Esse tipo de processamento de imagem, no entanto, é tratado mais a fundo em Anotando imagens com rótulos. Apenas lembre-se de usar "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)" ou "[-strip](https://imagemagick.org/command-line-options/#strip)" em vez de "[-resize](https://imagemagick.org/command-line-options/#resize)" nesses exemplos. Por exemplo... |

  magick thumbnail.gif \
          -background Lavender -fill navy -font Candice -pointsize 24 \
          label:Hatching   -gravity South -append \
          labeled.gif

[IM Output]
Com o uso de Fontes compostas você pode sobrepor rótulos muito sofisticados sobre a própria imagem. Aqui, por exemplo, usei a técnica de Fonte de contorno suave mais densa para anotar a miniatura, escurecendo a área ao redor do texto para garantir que ele permaneça sempre legível. |

  magick -define jpeg:size=400x400  hatching_orig.jpg  -resize '120x200>' \
      \( +clone -sample 1x1\! -alpha transparent -sample 1000x200\! \
         -font SheerBeauty -pointsize 72 -gravity Center \
         -strokewidth 8 -stroke black  -fill black  -annotate 0,0 '%c' \
         -channel RGBA -blur 0x8 \
         -strokewidth 1 -stroke white  -fill white  -annotate 0,0 '%c' \
         -fuzz 1% -trim +repage -resize 115x \
      \) -gravity North -composite           -strip annotated.gif

[IM Output]
Observe como não uso a imagem "thumbnail.gif" pré-gerada, nem uso o Operador de redimensionamento de miniatura para remover os perfis e comentários da imagem. Em seguida usei "[+clone](https://imagemagick.org/command-line-options/#clone)", "[+sample](https://imagemagick.org/command-line-options/#sample)" e "[-alpha](https://imagemagick.org/command-line-options/#alpha)" para gerar uma tela de trabalho transparente maior, que também contém uma cópia dos metadados da imagem original. Isso me permite usar a string de 'comentário' da imagem com o operador de anotação "[-annotate](https://imagemagick.org/command-line-options/#annotate)", para fornecer o texto a ser sobreposto na imagem. Somente no final, depois de ter composto a sobreposição de texto, é que faço a limpeza e "[-strip](https://imagemagick.org/command-line-options/#strip)" dessa informação.

Botão em relevo

O operador "[-raise](https://imagemagick.org/command-line-options/#raise)" foi basicamente criado com o único propósito de destacar as bordas de imagens retangulares para formar um botão em relevo. É uma transformação de miniatura simples, rápida e eficaz. |

  magick thumbnail.gif  -raise 8   raised_button.gif

[IM Output]
O mesmo operador tem uma forma 'plus' que pode ser usada para criar um efeito de destaque rebaixado. |

  magick thumbnail.gif  +raise 8   sunken_button.gif

[IM Output]

Botão bolha

Com um pouco de artifício, o operador "[-raise](https://imagemagick.org/command-line-options/#raise)" pode ser usado para produzir um botão em relevo suave, 'parecido com uma bolha'.

  magick thumbnail.gif -fill gray50 -colorize 100% \
          -raise 8 -normalize -blur 0x8  bubble_overlay.png
  magick thumbnail.gif bubble_overlay.png \
          -compose hardlight -composite  bubble_button.png

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

Veja Métodos de composição por luz para mais informações sobre esse tipo de técnica. Para mais efeitos como esse, veja Auto-enquadramento (interno) abaixo e, para levá-lo ao próximo nível, veja Máscara de efeito de iluminação abaixo.

Adicionando bordas

O humilde e simples operador "[-border](https://imagemagick.org/command-line-options/#border)" pode ser usado para gerar uma estrutura complexa ao redor de uma imagem. |

  magick thumbnail.gif \
          -bordercolor black -border 3   -bordercolor white -border 2 \
          \( -background black -fill white -pointsize 24 \
             label:Hatching   -trim +repage \
             -bordercolor black -border 10 \
          \) -gravity South -append \
          -bordercolor black -border 10   -gravity South -chop 0x10 \
          border_framework.gif

[IM Output]

Moldura simples

De forma semelhante, o operador "[-frame](https://imagemagick.org/command-line-options/#frame)" facilita adicionar uma moldura ao redor da imagem |

  magick thumbnail.gif   -mattecolor peru  -frame 9x9+3+3  framed.gif

[IM Output]
Esse operador também tem muitas outras opções para criar uma dúzia ou mais de estilos diferentes de molduras. Você pode ver exemplos das possibilidades em Moldura, adicionando uma borda com aspecto 3D.

Enquadramento com montage

O comando montage oferece uma maneira muito mais fácil de fazer tudo o que foi visto acima, e muito mais. Ele não apenas gera miniaturas (ou páginas inteiras de miniaturas), mas também pode rotular as miniaturas para incluir informações como nomes de arquivo, tamanho em disco e dimensões, ou uma string especificada pelo usuário. Aqui está um uso simples de "magick montage" para gerar uma miniatura com moldura. |

  magick montage -define jpeg:size=240x200  -label '%c'  hatching_orig.jpg \
          -frame 6  -geometry '120x100>'  montage_simple.gif

O rótulo vem do comentário do arquivo de imagem JPEG, que foi adicionado há muito tempo à imagem usando o comando não-IM "wrjpgcom". Veja Processamento JPEG não-IM para mais detalhes. [IM Output]
Mesmo apenas com "magick montage" você pode deixar a geração de miniaturas realmente sofisticada. |

  magick montage -define jpeg:size=400x180  -label '%c' hatching_orig.jpg \
          -thumbnail '200x90>' -geometry '130x100>'  -mattecolor peru \
          -frame 6  -bordercolor skyblue  -font LokiCola  -pointsize 18 \
          montage_fancy.gif

[IM Output]
Veja "Montage, matrizes de imagens" para mais detalhes. Você pode ter especial interesse no exemplo Mapas de imagem HTML de miniaturas com Montage. Isso cria uma página de índice HTML de miniaturas na qual clicar na miniatura exibe a imagem original, no mesmo diretório.

Bordas suaves e desfocadas

O Operador de vinheta oferece um meio simples de adicionar uma borda desfocada ao redor de uma imagem. |

  magick thumbnail.gif -alpha set \
          -background none  -vignette 0x4  vignette.png

[IM Output]
É claro que, como essa miniatura usa cor semitransparente, ela precisa ser salva no formato PNG. O método Morphology Distance oferece um verdadeiro 'esfumado' transparente das bordas de uma imagem. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -morphology Distance Euclidean:1,10\! +channel feathered.png

[IM Output]
A distância máxima da área transparente é controlada pela flag especial de escalonamento de distância 10\!'. Isso só foi adicionado no IM v6.6.1-6. Isso tem a vantagem adicional de funcionar também para imagens com formato, embora seja necessária uma inicialização mais complexa para preservar corretamente os pixels com anti-aliasing na fórmula de distância. Veja Esfumando formas usando Distance para mais detalhes. O esfumado aqui é um gradiente linear puro e pode ser ainda mais ajustado usando o Operador de contraste de não-linearidade sigmoide para dar-lhe uma aparência mais suave e afunilada de várias maneiras diferentes. Você também pode Esfumar imagens usando desfoque, usando o mesmo método de adicionar pixels virtuais transparentes antes de desfocar apenas o canal alfa. Isso gera um esfumado mais suave na imagem, além de arredondar visivelmente os cantos da imagem. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png

[IM Output]
A operação extra "[-level](https://imagemagick.org/command-line-options/#level)" (ajustando apenas o canal de transparência) garante que a borda se torne totalmente transparente, em vez de apenas meio transparente. No entanto, ela cai bruscamente em direção a zero na borda propriamente dita, devido à curva de aspecto sigmoide que o desfoque gera. Ela também tem um efeito aditivo nos cantos, fazendo com que fiquem arredondados, enquanto que, com uma imagem com formato de concavidade acentuada, pode fazer com que pixels totalmente transparentes se tornem semitransparentes. Assim, para formatos, pode ser necessário mascarar o resultado contra a imagem original (usando Composição Dst-In). Para miniaturas retangulares, porém, o resultado é satisfatório. Você pode ver outro exemplo de uso desse tipo de esfumado em Miniaturas em camadas. Se, em vez de fazer um ajuste de nível no esfumado desfocado, você aplicar um limiar ao canal alfa desfocado em '50%', poderá adicionar cantos pseudo-arredondados à imagem em miniatura acima. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -blur 0x8  -threshold 50% +channel rounded_corner_blur.gif

[IM Output]
Embora muito simples, o resultado não é uma maneira realmente boa de arredondar os cantos da imagem. Primeiro, os cantos não são de fato circulares, mas uma curva 'hiperbólica'. Segundo, o resultado não é uma curva suave com anti-aliasing, mas mostra 'serrilhados' causados pelo efeito de aliasing da Operação de limiar. Essa imagem pode, no entanto, ser salva no formato de arquivo GIF. Veja Transparência booleana do GIF para detalhes. Observe também que a operação "[-blur](https://imagemagick.org/command-line-options/#blur)" pode ficar muito lenta quando você trabalha com um argumento grande para gerar um canto arredondado maior. Portanto, esse método de arredondar cantos em grande escala não é nada recomendado. Para um efeito de borda desfocada mais incomum, você pode usar um desfoque radial apenas no canal alfa. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x45 +channel  radial_blur_edge.png

[IM Output]
Isso funciona melhor para imagens perfeitamente quadradas. À medida que a quantidade de desfoque angular aumenta, você acabará gerando uma borda circular parecida com uma vinheta. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x100 +channel  radial_blur_vignette.png

[IM Output]
Os dois artefatos parecidos com degraus que podem ser vistos são causados pelas duas dimensões de tamanho da imagem. Nenhum 'degrau' será visto em uma imagem quadrada. Adicionar um pouco de desfoque normal extra ao último exemplo também pode melhorar o problema do degrau.

Cantos arredondados e com formato

Embora aplicar limiar a uma borda suave desfocada (veja acima) gere um canto arredondado adequado à transparência booleana do GIF, isso não gera um canto suave com 'anti-aliasing'. A maneira adequada de gerar uma imagem com cantos arredondados, ou de qualquer outro formato, é de fato recortar cada canto usando uma máscara do formato desejado. O método a seguir, de Leif Åstrand leif@sitelogic.fi, multiplica uma máscara de imagem inteira para gerar o resultado apropriado. |

  magick thumbnail.gif \
     \( +clone  -alpha extract \
        -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
        \( +clone -flip \) -compose Multiply -composite \
        \( +clone -flop \) -compose Multiply -composite \
     \) -alpha off -compose CopyOpacity -composite  rounded_corners.png

[IM Output]
Basicamente, extrai a máscara de transparência branca da imagem original, com apenas um canto preto arredondado. Isso é então invertido na vertical (flip) e na horizontal (flop) para produzir uma máscara com todos os quatro cantos arredondados. E, finalmente, essa máscara é aplicada à imagem original. Para imagens muito maiores, pode ser melhor aplicar uma máscara muito menor a cada canto individual para reduzir a quantidade total de processamento necessária. São mais etapas de processamento individuais, mas, no geral, menos processamento dos pixels em si. Por exemplo, aqui está a mesma coisa, mas recortando um formato triangular simples desenhado em cada canto. Isso funcionará com imagens muito maiores. |

  magick thumbnail.gif -alpha set  -compose DstOut \
      \( -size 20x15 xc:none -draw "polygon 0,0  0,14 19,0" \
         -write mpr:triangle  +delete \) \
      \( mpr:triangle             \) -gravity northwest -composite \
      \( mpr:triangle -flip       \) -gravity southwest -composite \
      \( mpr:triangle -flop       \) -gravity northeast -composite \
      \( mpr:triangle -rotate 180 \) -gravity southeast -composite \
      corner_cutoff.png

[IM Output]
Se você não quiser transparência, mas sim alguma outra cor, ainda pode fazer o que foi visto acima e depois Remover a transparência. Isso pode ser importante para imagens JPEG. No entanto, uma solução ainda mais simples (em termos de complexidade e uso de memória) foi encontrada em uma discussão no fórum do IM. Ela sobrepõe cantos coloridos ('Red' neste caso) em vez de torná-los transparentes. |

  magick thumbnail.gif \
    \( +clone -crop 16x16+0+0  -fill white -colorize 100% \
       -draw 'fill black circle 15,15 15,0' \
       -background Red  -alpha shape \
       \( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \
     \) -flatten  rounded_corners_red.png

[IM Output]
Infelizmente, esse método não pode ser usado para simplesmente 'apagar' os cantos da imagem tornando-os transparentes, devido a uma interação com uma 'tela de fundo' da Operação Flatten; um futuro operador de camadas pode resolver isso. | O último exemplo falhará em versões do IM anteriores à v6.6.6-5, porque tanto o operador "[-flip](https://imagemagick.org/command-line-options/#flip)" quanto o "[-flop](https://imagemagick.org/command-line-options/#flop)" não tratam corretamente o deslocamento da tela virtual.
---|---
Usando um truque de ciclo polar, podemos gerar uma máscara circular perfeita com anti-aliasing para uma miniatura de qualquer tamanho. É claro que usaremos a imagem distorcida apenas como máscara para a imagem original, de modo a obter o melhor resultado. |

  magick thumbnail.gif -alpha set \
    \( +clone -distort DePolar 0 \
       -virtual-pixel HorizontalTile -background None -distort Polar 0 \) \
    -compose Dst_In -composite -trim +repage circle_masked.png

[IM Output]
Levaremos esse estilo de processamento de imagem mais adiante em Borda com cantos arredondados abaixo. Lá, não apenas recortamos os cantos, mas também sobrepomos imagens de enquadramento apropriadas.

Borda de papel rasgado

Leif Åstrand leif@sitelogic.fi contribuiu com o seguinte código IM para gerar uma borda que parece ter sido rasgada de um papel fibroso (como jornal)... |

  magick thumbnail.gif \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite torn_paper.png

[IM Output]
Uma melhoria pode ser fazer com que pareça que você o rasgou do canto de um jornal. |

  magick thumbnail.gif -bordercolor linen -border 8x8 \
          -background Linen  -gravity SouthEast -splice 10x10+0+0 \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite \
          -gravity SouthEast -chop 10x10   torn_paper_corner.png

[IM Output]
Isso poderia ser melhorado adicionando bordas na cor de 'papel' e uma máscara de formato curvo, de modo que pareça que a imagem foi rasgada grosseiramente à mão. Adicionar uma 'sombra suave' (veja a seguir) também 'destacará' a imagem resultante do fundo, fazendo com que pareça uma peça separada. Como sempre, sugestões e contribuições são bem-vindas.

Adicionando uma sombra

O operador "[-shadow](https://imagemagick.org/command-line-options/#shadow)" facilita a geração de sombras de qualquer imagem com formato. Por exemplo, aqui eu adiciono uma sombra colorida semitransparente à miniatura. |

  magick thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x0+4+4 \) +swap \
          -background none -mosaic   shadow_hard.gif

[IM Output]
Mas você também pode criar sombras suaves e difusas com a mesma facilidade. |

  magick -page +4+4 thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x4+4+4 \) +swap \
          -background none -mosaic     shadow_soft.png

[IM Output]
Observe que novamente usei uma imagem no formato PNG para a saída das miniaturas. Isso porque a imagem com sombra conterá muitos pixels semitransparentes, que o GIF não consegue tratar. (Sim, estou me repetindo, mas é importante). Se você planeja usar o formato GIF ou JPG, precisará usar uma cor "[-background](https://imagemagick.org/command-line-options/#background)" mais apropriada para a página web ou a tela maior na qual planeja exibir sua miniatura, já que esses formatos não tratam cores semitransparentes. Aviso: embora o que foi visto acima funcione para miniaturas individuais, geralmente falhará quando você quiser sobrepor várias miniaturas umas sobre as outras. A razão é que as sombras não se acumulam da mesma forma que as imagens normais. Para ver como tratar sombras de várias imagens em camadas, veja Camadas de sombras.

Adicionando alguma espessura

Adicionar espessura a uma imagem ou formato se parece um pouco com adicionar uma sombra dura (veja acima), mas não é exatamente o mesmo e precisa de algum trabalho extra para ficar certo. Isso é, na verdade, muito complicado, pois criamos uma máscara colorida da imagem, que é então replicada várias vezes e colocada em camadas sob a imagem original (usando a composição 'DstOver') com deslocamentos crescentes para dar espessura à imagem. |

  magick thumbnail.gif -alpha set \
          \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
          \( +clone -repage +1+2 \) \
          \( +clone -repage +1+3 \) \
          \( +clone -repage +2+4 \) \
          \( +clone -repage +2+5 \) \
          \( +clone -repage +3+6 \) \
          -background none -compose DstOver -mosaic  thickness.gif

[IM Output]
Você entendeu a ideia. Cada linha '\( +clone ... \)' adiciona um pixel extra à imagem na direção sul-sudeste. Além disso, como nenhum pixel semitransparente está envolvido (pelo menos para uma imagem retangular), você pode usar o formato de imagem GIF para o resultado. O grande problema dessa técnica é que é difícil especificar uma espessura como argumento variável ou em ângulos diferentes, a menos que você escreva um script específico para adicionar espessura. Além disso, a borda das partes anguladas da espessura não tem anti-aliasing, então há muito espaço para melhoria.

Miniaturas estilo polaroid

Você pode fazer sua imagem em miniatura parecer uma foto polaroid, dar-lhe uma sombra e até rotacioná-la um pouco para que pareça estar apenas apoiada sobre uma mesa. |

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate 6 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  none   -flatten \
          poloroid.png

[IM Output]
Uma versão mais complexa do que foi visto acima foi adicionada ao IM v6.3.1-6 como um operador de transformação "[-polaroid](https://imagemagick.org/command-line-options/#polaroid)". Por exemplo... |

  magick thumbnail.gif -bordercolor snow -background black +polaroid \
          poloroid_operator.png

[IM Output]
Observe que a imagem não só tem a moldura polaroid, mas a foto também recebeu um pouco de 'curvatura' com ajustes de sombra apropriados, dando mais profundidade à imagem resultante. A forma com mais (+) usa um ângulo aleatório, enquanto a forma normal com menos (-) permite fornecer o ângulo de rotação. Agradecimentos especiais a Timothy Hunter pela ideia por trás dessa técnica. Você pode até adicionar um "[-caption](https://imagemagick.org/command-line-options/#caption)", definir sua própria cor de sombra e especificar sua própria rotação (ou nenhuma). |

  magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
          -font Ravie -gravity center -bordercolor Lavender \
          -background navy  -polaroid -0     poloroid_caption.png

[IM Output]
Para mais informações sobre o uso desse operador, veja Transformação polaroid complexa. Para estes exemplos, porém, continuarei a usar um método de criação DIY (faça você mesmo), pois preciso de um controle mais fino das bordas e dos efeitos de sombra para demonstrar o 'empilhamento' adequado de fotos. E lá vamos nós... Fazendo várias cópias da fotografia (ou usando outras imagens) e adicionando bordas polaroid, você pode então rotacioná-las aleatoriamente e empilhá-las para produzir uma pilha de fotos com boa aparência. |

  magick thumbnail.gif \
     -bordercolor white  -border 6 \
     -bordercolor grey60 -border 1 \
     -bordercolor none  -background  none \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     -delete 0  -border 100x80  -gravity center \
     -crop 200x160+0+0  +repage  -flatten  -trim +repage \
     -background black \( +clone -shadow 60x4+4+4 \) +swap \
     -background none  -flatten \
     poloroid_stack.png

[IM Output]
| O comando incorporado "magick ... " no exemplo acima gera um número de ponto flutuante aleatório de -15 a +15. Para mais informações sobre o uso do IM como uma calculadora matemática, veja Expressões FX. Uma alternativa é atribuir números aleatórios a variáveis de shell e substituí-los no comando acima.
---|---
É claro que você poderia substituir por um conjunto de imagens diferentes em vez de repetir a mesma imagem ao criar a pilha. Ou selecionar um conjunto de ângulos de rotação de modo que todos sejam razoavelmente diferentes, ou mais agradáveis de olhar. Se você for realmente bom, pode até deslocar as imagens rotacionadas (variar um pouco a posição delas) para que não fiquem todas empilhadas perfeitamente centralizadas. Mas você entendeu a ideia básica. Se você realmente quiser evitar o uso do formato PNG, devido aos seus problemas atuais com alguns navegadores, pode usar o formato de imagem GIF. Para isso, você deve estar disposto a aceitar algumas limitações de cor e conhecer a cor de fundo exata sobre a qual a imagem será exibida. A cor 'LightSteelBlue' no caso destas páginas. |

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate -9 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  LightSteelBlue  -flatten    poloroid.gif

[IM Output]
Para detalhes sobre essa técnica (e mais), veja Imagens GIF sobre um fundo de cor sólida. A técnica de 'polaroid empilhada' acima foi gentilmente fornecida por Ally, de Ally's Trip, e Stefan Nagtegaal, de Muziekvereniging Sempre Crescendo, ambos usando miniaturas estilo polaroid extensivamente em seus sites. No Fórum de usuários do IM, o usuário grazzman foi um pouco além, sobrepondo imagens sobre uma tela rotativa para criar uma disposição de fotos. |

  magick -size 150x150 xc:none -background none \
          -fill white -stroke grey60 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate +10 \
          -trim +repage -background LightSteelBlue -flatten \
          poloroid_spread.gif

[IM Output]
É claro que, para uma disposição de fotos como esta, você realmente precisa usar um conjunto de fotos diferentes em vez de usar a mesma imagem repetidamente, como fiz aqui. Há algumas ressalvas que você pode querer considerar com essa técnica.

  • O enquadramento foi codificado diretamente no exemplo acima e depende do tamanho da imagem em miniatura. Em uma aplicação real, o enquadramento pode ser movido para a etapa de geração da miniatura, em vez de ficar na disposição de fotos acima.
  • Como "[-rotate](https://imagemagick.org/command-line-options/#rotate)" também expande o tamanho da tela, a posição em que as imagens são adicionadas muda, a menos que você as posicione usando um deslocamento a partir da posição "[-gravity](https://imagemagick.org/command-line-options/#gravity) center".
  • E, por fim, rotacionar constantemente a moldura de fundo não é uma boa ideia em termos de qualidade. Rotacionar uma imagem já rotacionada adiciona mais distorções em nível de pixel ao resultado do que fazer uma rotação para cada imagem separada antes de sobrepô-la.

Um empilhamento aleatório semelhante de fotos sobre uma área maior foi desenvolvido para Stas Bekman's Photography, mas com uma técnica de bordas diferente. Um método mais generalizado para criar algum tipo de layout ordenado ou programado de fotos e imagens é mostrado e descrito em Exemplos de camadas de imagem, bem como em Fotos sobrepostas.


Técnicas de Enquadramento

Aqui veremos algumas técnicas avançadas de enquadramento que usam um conhecimento muito avançado de como o IM funciona para obter os resultados desejados.

Auto-enquadramento (Externo)

O auto-enquadramento é uma técnica que pode ser usada para enquadrar uma imagem, usando a própria imagem para gerar as cores e os padrões do enquadramento. Ou seja, a moldura adicionada não é fixa, mas varia de modo a corresponder aproximadamente à imagem que está sendo enquadrada. Isso pode ser feito de duas maneiras. Estenda a imagem original de modo a criar uma Moldura Externa , ou use parte da própria imagem real para criar uma Moldura Interna. Por exemplo, se ampliarmos a imagem e a escurecermos, antes de sobrepor a imagem original em cima, obtemos uma moldura de aparência muito agradável. |

  magick thumbnail.gif \
          \( -clone 0 -resize 130% +level 20%x100% \) \
          \( -clone 0 -bordercolor black -border 1x1 \) \
          -delete 0 -gravity center -composite  self_bordered.gif

[IM Output]
| Em vez de usarAjustes de Nível para clarear (ou escurecer) a imagem de enquadramento, uma maneira alternativa de tornar a borda de cor mais clara ou mais escura é aplicar Tingimento de Cor à moldura usando algo como...
"-fill white -colorize 30%"

---|---
Outra maneira de tingir a imagem de cor para gerar a moldura é simplesmente fazer o IM sobrepor uma Moldura semitransparente sobre a imagem ampliada. No entanto, isso exige que você conheça o tamanho da miniatura para redimensioná-la exatamente na medida certa para acomodar a moldura gerada. |

  magick thumbnail.gif \
          \( -clone 0 -resize 140x110\! \) \
          \( -clone 0 -bordercolor black -border 1x1 \
                      -mattecolor '#8884' -frame 9x9+0+9 \) \
          -delete 0 -composite  self_framed.gif

[IM Output]
Uma variação do exemplo acima usa o controle especial de viewport e a configuração padrão de Pixel Virtual, Edge para estender a borda de uma imagem desfocada e gerar a moldura externa. |

  magick thumbnail.gif \( +clone \
             -set option:distort:viewport 150x120-15-15 \
             -virtual-pixel Edge    -distort SRT 0  +repage \
             -blur 0x3 +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_edge.gif

[IM Output]
Apenas uma palavra de advertência. Um pequeno defeito na borda (como uma árvore ou uma folha) pode produzir resultados indesejáveis em uma moldura gerada usando apenas a borda da imagem. O viewport precisa conhecer o tamanho da imagem original para ampliar e deslocar esse viewport na medida apropriada. No entanto, você pode usar Expressões de Escape FX para calcular o tamanho do viewport (veja os exemplos abaixo). Uma alternativa é usar um Pixel Virtual, Dither desfocado no exemplo acima. Isso espalha mais as cores e fica não tão "esquinado". Mas se você adicionar desfoques antes e depois da expansão, você usa o dither para produzir um efeito semelhante a tecido. |

  magick thumbnail.gif \( +clone  -blur 0x3 \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Dither  -distort SRT 0  +repage \
             -blur 0x0.8  +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_dither.gif

[IM Output]
O primeiro desfoque modula a cor média, enquanto o segundo ajusta o quão "pixelizado" ou suave é o padrão de dither. Aqui está outro exemplo, desta vez usando Pixel Virtual, Mirror, com uma Borda Suave (enegrecida) que acabou funcionando muito bem para esta imagem específica. |

  magick thumbnail.gif  \( +clone \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Mirror -distort SRT 0 +repage \
             -alpha set -virtual-pixel transparent \
                 -channel A -blur 0x8 +channel \
             -background Black -flatten \) \
          +swap -gravity center -compose over -composite \
          self_mirror.gif

[IM Output]
Em todos os casos acima, as molduras são geradas a partir da mesma imagem, que é então combinada para produzir uma moldura baseada nas cores vindas da imagem original. A borda de enquadramento é assim única e corresponde a cada imagem de miniatura que é enquadrada. Fred Weinhaus criou um script "[imageborder](http://www.fmwconcepts.com/imagemagick/imageborder/)" para facilitar as imagens de auto-enquadramento, com bordas geradas a partir de ampliações desfocadas da imagem original, ou de alguma forma de configuração de Pixel Virtual que define o conteúdo.

Auto-enquadramento (Interno)

Em vez de ampliar a imagem para adicionar a nova borda, podemos transformar partes da própria imagem em uma borda. Já vimos algumas técnicas de adicionar uma moldura dentro da própria imagem. As técnicas de Botão Elevado e Botão em Bolha fazem isso, usando o operador "[-raise](https://imagemagick.org/command-line-options/#raise)". Aqui geramos uma versão mais clara e desfocada da imagem original que é então sobreposta usando uma máscara também gerada a partir da imagem original. Uma borda branca é então adicionada para separar essa versão mais clara e desfocada da parte central não modificada da imagem. |

  magick thumbnail.gif \( +clone -blur 0x3 +level 20%,100% \) \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 10x10 \) \
          -composite \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 1x1 \
             -bordercolor black -border 9x9 \) \
          -compose screen -composite \
          self_blurred_border.gif

[IM Output]
Você também pode usar o Operador de Moldura para obter algo um pouco diferente dos efeitos de Botão vistos anteriormente. O truque é primeiro Aparar (Shave) a imagem original antes de aplicar. Por exemplo, aqui faço uma cópia da imagem original, aparo-a e a emolduro usando uma moldura transparente, antes de sobrepô-la sobre a imagem original. |

  magick thumbnail.gif \( +clone -shave 10x10 \
            -alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
          \) -composite  inside_frame_trans.gif

[IM Output]
O problema com isso é que você sempre "clareará" ou "escurecerá" (reduzirá o contraste) das partes planas da moldura em torno da imagem original. Para evitar isso, podemos usar a mesma técnica da técnica de Botão em Bolha. Geramos uma moldura sobre uma tela cinza perfeita e a modificamos de modo a gerar uma Máscara de Composição de Efeitos de Iluminação, para ajustar as cores da imagem original. Por exemplo, aqui uso uma composição '[VividLight](compose.html#vividlight)' com a imagem de máscara emoldurada para preservar melhor as cores primárias. |

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 \
          \) -compose VividLight -composite  inside_frame_light.gif

[IM Output]
Assim como no Botão em Bolha, você também pode desfocar a máscara de iluminação antes de aplicar. Aqui usei uma composição '[HardLight](compose.html#hardlight)' mais comum, que não realça as cores primárias, com uma máscara de iluminação de moldura desfocada. |

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 -blur 0x2 \
          \) -compose HardLight -composite  inside_frame_blur.gif

[IM Output]
| AlgunsMétodos de Composição de Luz podem exigir que você Troque as Imagens antes de compô-las para obter o efeito de iluminação correto.
---|---
Para levar esse tipo de efeito ainda mais longe, produzindo resultados muito mais complexos, veja a avançada Máscara de Efeito de Iluminação.

Sobreposição Simples de Borda

Um tipo simples de enquadramento é criar uma moldura sofisticada, ou uma imagem com formato, na qual você pode colocar sua imagem, sob a moldura. Por exemplo, aqui geramos uma moldura simples ligeiramente maior que nossa imagem, com um buraco de formato sofisticado. O formato foi extraído da fonte 'WebDings' (caractere 'Y'), mas há muitas fontes possíveis de formatos sofisticados que poderiam ser usados para enquadrar imagens. |

  magick -size 120x140 -gravity center -font WebDings label:Y \
          -negate -channel A -combine +channel -fill LightCoral -colorize 100% \
          -background none -fill none -stroke firebrick -strokewidth 3 label:Y \
          -flatten +gravity -chop 0x10+0+0 -shave 0x10 +repage border_heart.png

[IM Output]
Para outras maneiras de gerar uma borda em uma imagem já com formato, veja a Transformação de Borda. Você também pode, opcionalmente, dar à moldura um pouco de profundidade usando um Efeito de Sombra. |

  magick border_heart.png  \( +clone -background black -shadow 60x3+3+3 \) \
          -background none -compose DstOver -flatten   border_overlay.png

[IM Output]
Agora que temos uma moldura de sobreposição simples, podemos colocar a imagem por baixo, no centro, sob a moldura, usando uma composição '[DstOver](../static/img/compose/dstover)'. |

  magick border_overlay.png  thumbnail.gif \
          -gravity center -compose DstOver -composite   border_overlaid.jpg

[IM Output]
Agora você pode gerar uma biblioteca de molduras pré-preparadas para usar com suas imagens, como esta Imagem de Folhas de Outono.

    magick thumbnail.gif  autumn_leaves.png +swap \
            -gravity center -compose DstOver -composite \
            border_leaves.gif

[IM Text] [IM Text] [IM Text]

Note que troquei a ordem das imagens e usei '[DstOver](compose.html#dstover)' para colocar a segunda imagem, a principal, 'sob' a moldura. Dessa forma, é a moldura que determina o tamanho final da imagem, e não a imagem original. No entanto, fazer isso também perderia qualquer metadado que a imagem principal tenha (pela mesma razão). Se você realmente quiser preservar os metadados das miniaturas (como rótulos e comentários, tais como uma mensagem de direitos autorais), então a melhor ideia é Preencher a Miniatura até o mesmo tamanho da moldura, e então usar a composição padrão '[Over](compose.html#over)' para sobrepor a moldura. Dessa forma, a miniatura é a imagem 'destino' e seus metadados de imagem são preservados.

Exemplo de Sobreposição de Emblema

Aqui está outro exemplo de sobreposição pré-preparada mais complexo, desta vez usando uma imagem de tamanho correto (usando extent como método de recorte), da Discussão do Fórum IM Composite Overlay and Masking.

    magick thumbnail.gif  -gravity center -extent 90x90 \
            badge_overlay.png -composite     badge.png

[IM Text] [IM Text] [IM Text]

Note que a imagem em si não é distorcida, apenas ligeiramente clareada e escurecida, com um círculo recortado e uma sombra adicionada, tudo em uma única imagem de sobreposição. Se este fosse um emblema real, ou uma 'bolha de vidro', então a imagem também deveria ser um pouco distorcida (talvez usando uma Distorção de Barril), mas funciona bem sem precisar de tal distorção. Para o próximo passo no exemplo do 'emblema', veja Emblema usando Máscara e Pintura, que adiciona transparência de fundo em torno da parte externa do emblema.

Técnica de Máscara e Pintura

Em muitos casos você não quer apenas sobrepor uma borda quadrada em torno de uma imagem, mas também recortar as bordas da imagem, tornando-as transparentes. Para isso você tipicamente usaria pelo menos duas imagens. Uma é a sobreposição mascarada contendo as cores, sombras e realces que você quer adicionar à imagem existente. E uma segunda imagem contendo as partes que você quer remover da imagem original. As duas imagens podem ser aplicadas de duas maneiras diferentes. Você pode ou 'mascarar' primeiro para remover as partes indesejadas da imagem e então sobrepor a moldura, ou você pode sobrepor uma moldura e então mascarar como transparentes as partes indesejadas tanto da imagem original quanto das cores sobrepostas. Qual método você usa é crítico, e as imagens envolvidas serão projetadas para uma técnica específica. Você não pode usar imagens de um método na ordem errada, ou as coisas não funcionarão corretamente. Por exemplo, vamos criar uma borda de formato mais complexo, mas desta vez não se preocupe em configurar o fundo. |

  magick -size 120x100 xc:none -fill none -stroke black -strokewidth 3 \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          -strokewidth 3  -draw 'ellipse 60,50 57,47 0,360' \
          -channel RGBA  -blur 2x1    border_ellipse.png

[IM Output]
Agora eu propositalmente tornei esta borda desfocada, para tornar os componentes da borda muito mais semitransparentes. Mesmo sem essa nebulosidade extra, uma borda também contém muitos pixels de suavização (anti-aliasing) semitransparentes, que fazem a borda parecer mais suave e menos serrilhada. É vital, no processamento de imagem, que você considere esses pixels semitransparentes, de modo a preservá-los e defini-los corretamente. Para tornar mais interessante, dê a esta borda 'nebulosa' um pouco aleatório de coloração. |

  magick border_ellipse.png \
          \( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
          -compose SrcIn -composite     border_ellipse_red.png

[IM Output]
Certo, temos uma borda, mas ainda precisamos de alguma maneira de definir o que deve representar o exterior e o interior da borda. Basicamente precisamos de uma máscara para definir essas duas áreas. |

  magick -size 120x100  xc:none -fill black \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          border_ellipse_mask.png

[IM Output]
A cor desta imagem de 'máscara' não é importante, apenas o seu formato, já que ela basicamente define quais partes serão classificadas como internas e quais serão externas. A máscara pode ser uma máscara em escala de cinza, ou pode ser uma máscara de formato como a mostrada acima. Embora a última seja tipicamente mais útil, e possa até ser um formato das partes a apagar, ou das partes a serem mantidas (como acima). Neste caso as imagens são projetadas como uma técnica de "máscara e pintura ", significando que você deve primeiro apagar as partes indesejadas, e então sobrepor as cores de borda adicionais (que também têm uma máscara de transparência envolvida). Por exemplo...

  magick thumbnail.gif -alpha set  -gravity center -extent 120x100 \
          border_ellipse_mask.png  -compose DstIn -composite \
          border_ellipse_red.png   -compose Over  -composite \
          border_mask_paint.png

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

São sempre necessárias duas Operações de Composição Alfa de Duff-Porter. Uma para tornar partes transparentes, e outra para sobrepor as cores adicionais que contornam a borda ou moldura. Duas imagens são necessárias e, como tal, devem ser mantidas separadas. Alguns formatos como MIFF e GIF permitem que você salve ambas as imagens no mesmo arquivo, para facilitar o armazenamento. É claro que você pode combinar as duas imagens para criar uma única imagem de enquadramento de sobreposição simples, mas apenas se você quiser usar uma cor fixa não transparente para as partes externas do resultado. Por exemplo, predefina o exterior como uma cor DodgerBlue... |

  magick border_ellipse_mask.png -alpha extract -negate \
          -background DodgerBlue -alpha shape \
          border_ellipse_red.png   -compose Over -composite \
          border_ellipse_overlay.png

[IM Output]
Mas, nesse caso, você poderia simplesmente colocar uma cor sólida ou alguma outra imagem de fundo por baixo da imagem com máscara dupla gerada anteriormente... |

  magick border_double_masked.png \
          \( -size 120x100 plasma:Green-Green -blur 0x1 \) \
          +swap  -compose Over  -composite     border_background.png

[IM Output]
O ponto é que, com duas imagens, uma imagem de 'máscara' e uma de 'sobreposição', você tem muito mais liberdade em como adiciona a borda à imagem. Você poderia até definir múltiplas imagens de 'máscara', para definir as diferentes 'janelas' da imagem de borda 'sobreposta'. Você também pode adicionar realces e sombras opcionais, em vez de codificá-los rigidamente em uma única imagem de enquadramento de sobreposição. Agora, uma ressalva importante. As bordas da imagem de máscara não devem coincidir com as bordas da imagem de sobreposição. Se elas coincidirem, você não obterá o tratamento correto das cores ao longo das bordas coincidentes, ou gerará outros estranhos efeitos de 'halo'. Como tal, você precisa garantir que as bordas da máscara caiam em algum lugar dentro da região totalmente opaca da imagem de sobreposição. Cautela e reflexão prévia com as duas operações de mascaramento são necessárias.

Borda com Cantos Arredondados

Como você viu acima, a Técnica de Máscara e Pintura pode ser usada tanto para adicionar cores extras ou 'enfeites' a uma imagem, quanto para remover partes, de modo a moldar a imagem final. Isso nos apresenta uma maneira alternativa de adicionar cantos arredondados a uma imagem. O operador "[-draw](https://imagemagick.org/command-line-options/#draw)" do IM vem com um método 'roundrectangle' que pode ser usado para fornecer uma moldura interessante em torno da imagem. No entanto, você precisa dimensionar as medidas desse método de desenho para corresponder à imagem. O IM fornece métodos para extrair e até fazer cálculos matemáticos com base no tamanho da imagem. As coordenadas em que se localiza o retângulo referem-se ao exato 'centro' da largura de traço usada para definir o retângulo (pode ser um valor de ponto flutuante). Além disso, elas são dadas em termos de 'coordenadas de pixel' (veja Coordenadas de Pixel vs de Imagem), o que significa que um valor de 1,1 se refere ao segundo pixel a partir das bordas superior e esquerda, mas, mais importante, refere-se ao 'centro' do pixel, que na realidade fica a 1,5 unidade das bordas superior e esquerda reais. Agora usaremos uma largura de traço (SW) de 3, o que torna a imagem 3 pixels maior em todos os lados. Isso então significa que o retângulo será posicionado a SW/2 - 0.5 ou 1,0 pixel do canto superior esquerdo, e a ImageSize + SW*1.5 - 0.5 ou tamanho da imagem + 4 pixels no canto inferior direito. Aqui usamos o próprio IM para fazer esses cálculos, gerando o comando de desenho exato necessário usando sofisticados escapes FX. Isso é salvo como um Arquivo Magick Vector Graphics que pode ser usado diretamente pelo draw em comandos posteriores.

  magick thumbnail.gif \
          -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
          info: > rounded_corner.mvg

[IM Text]

| Se você conseguir descobrir o tamanho da imagem de uma maneira diferente (usando o shell, ou algum outro wrapper de linguagem de API), você pode substituir os parâmetros de desenho apropriados diretamente nos próximos exemplos, em vez de usar uma expressão matemática FX. Basicamente, o exemplo acima torna todo esse processo independente do tamanho real da miniatura. Qualquer outra maneira, incluindo codificação rígida direta, também é aceitável.
---|---
Agora podemos usar isso para gerar a sobreposição e uma imagem de máscara. Como parte disso, criamos uma Tela Transparente usando a imagem original (que é primeiro ampliada pela largura de traço), para acertar o tamanho.

  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill white -stroke none -strokewidth 0 \
          -draw "@rounded_corner.mvg"    rounded_corner_mask.png
  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill none -stroke black -strokewidth 3 \
          -draw "@rounded_corner.mvg"    rounded_corner_overlay.png

[IM Text] [IM Text]

E aí temos a imagem de borda de sobreposição e a imagem de máscara de transparência de que precisamos para a técnica de máscara dupla. Note que as máscaras são para uma imagem que é uma largura de traço maior que a imagem original, e que a máscara de formato de apagamento (em branco) não cobre toda a área ampliada, pois há uma folga de 1 pixel ao redor dela. Então, vamos aplicá-la usando a técnica de Máscara Dupla... |

  magick thumbnail.gif -alpha set -bordercolor none -border 3  \
          rounded_corner_mask.png -compose DstIn -composite \
          rounded_corner_overlay.png -compose Over -composite \
          rounded_border.png

[IM Output]
E aí temos nossa imagem com borda de cantos arredondados. O que se segue é como você pode fazer tudo o que foi feito acima em um único comando com um pouco de sofisticação extra. No entanto, este comando tudo-em-um ainda gerará um arquivo temporário contendo os comandos de desenho gerados, necessários para uma imagem do tamanho dado. |

  magick thumbnail.gif \
      -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15' \
      -write info:tmp.mvg \
      -alpha set -bordercolor none -border 3 \
      \( +clone -alpha transparent -background none \
         -fill white -stroke none -strokewidth 0 -draw @tmp.mvg \) \
      -compose DstIn -composite \
      \( +clone -alpha transparent -background none \
         -fill none -stroke black -strokewidth 3 -draw @tmp.mvg \
         -fill none -stroke white -strokewidth 1 -draw @tmp.mvg \) \
      -compose Over -composite               rounded_border_in_one.png
  rm -f tmp.mvg      # Limpeza do arquivo temporário

[IM Output]
Uma maneira melhor de fazer cantos arredondados, especialmente com imagens muito grandes, será usar uma técnica separada de imagem de mascaramento de cantos, que veremos abaixo em Sobreposições de Cantos Sofisticados. De muitas maneiras, isso é uma extensão do método acima, mas usando mascaramento separado para cada canto da imagem, de modo a manter pequenas as imagens de trabalho.

Emblema usando Máscara e Pintura

Aqui está um exemplo de "máscara e pintura" muito mais complexo, que foi desenvolvido a partir da imagem usada anteriormente no exemplo de Sobreposição de Emblema acima. A geração das duas imagens foi 'improvisada', e foi discutida nos fóruns do IM Composite Overlay and Masking. Idealmente, as duas imagens teriam sido desenvolvidas juntas.

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_trans_bg.png

[IM Text] [IM Text] [IM Text] [IM Text]

Note que acima eu disse que você deve evitar tentar alinhar as bordas de transparência e as bordas da máscara. No exemplo acima eu fiz exatamente isso, e as bordas da imagem resultante não ficarão totalmente corretas. No entanto, como a coloração é realmente apenas uma sombreamento sutil, em vez de uma borda forte, parece funcionar bem neste exemplo. Cautela, no entanto, deve ser exercida. Para o próximo passo nos exemplos do 'emblema', veja Emblema usando Pintura e Máscara, que inverte a ordem das duas operações de composição, exigindo um conjunto diferente de imagens.

Técnica de Pintura e Máscara

Em vez de 'Mascarar e depois Pintar ', você pode usar um conjunto diferente de imagens e sobrepor as cores adicionais primeiro, antes de mascarar e remover o fundo. Ou seja, você pode realizar um 'Pintar e depois Mascarar '. Isto é, você pegaria sua imagem e sobreporia a borda, que não apenas define todas as cores finais da borda, mas também mascara e colore parte ou todas as partes externas à imagem original. Você então usa uma máscara 'externa' ou de 'recorte' separada para remover todas as partes indesejadas da imagem resultante. Note também que tanto a imagem de 'sobreposição' quanto a de 'mascaramento' definem a borda interna separadamente da borda externa. Como resultado, uma imagem não define completamente toda a borda em uma única imagem, o que pode tornar seu uso um pouco mais difícil. No entanto, pode ser mais simples de implementar. Por exemplo...

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 0 \
          -draw 'ellipse 45,45 55,37 0,360' \
          -channel RGBA -negate -blur 0x3  +channel \
          \( granite: -auto-level -blur 0,0.7 \) \
          -compose ATop -composite border_paint.png

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 5 \
          -draw 'ellipse 59,45 56,40 0,360' border_mask.png

  magick thumbnail.gif -alpha set \
          border_paint.png -compose Over  -composite \
          border_mask.png  -compose DstIn -composite \
          border_paint_mask.png

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

Note como algumas partes das cores sobrepostas são removidas. Esta é a característica principal da técnica de Pintura e Máscara, permitindo que você use uma sobreposição mais simples, que é então ajustada pela máscara. Este método de mascaramento de imagem é o que é usado no próximo conjunto de exemplos de Cantos de Página Enrolada, e novamente mais tarde em Bordas de Cantos Sofisticados abaixo.

Cantos com Página Dobrada

Fred Weinhaus criou um script de shell especial chamado PageCurl que adiciona uma simples dobra de página a uma imagem existente, usando matemática muito complexa (em shell). Por exemplo... |

  pagecurl thumbnail.gif  pagecurl.png

[IM Output]
Internamente ele na verdade usa a técnica Pintar & Mascarar. Ou seja, primeiro sobrepõe uma "sobreposição de dobra" um pouco grande demais, depois apaga (mascara) o restante da imagem, incluindo uma pequena parte da sobreposição, que se tornará o canto transparente. No entanto, se você quiser aplicar uma dobra de página a muitas imagens, usar o script completo (acima) é uma técnica bastante lenta. Afinal, ele realiza uma enorme quantidade de processamento matemático (usando o próprio IM como calculadora de ponto flutuante) para de fato calcular e gerar as imagens de sobreposição e de máscara apropriadas. Para aplicar uma dobra de página a muitas imagens é melhor usar o script uma única vez, de modo a gerar a imagem de sobreposição e a máscara de transparência apenas uma vez. Então vamos extrair essas duas imagens para imagens menores de 64x64 pixels (usando uma opção especial '-i "pagecurl" adicionada ao script para esse fim). |

  magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:

[IM Output] [IM Output]
O comando acima cria dois arquivos de imagem: "pagecurl_overlay.png" e "pagecurl_mask.png", mostrados. A imagem de entrada em si não importa, pois o que queremos são as imagens de máscara. O resultado da "página dobrada" é simplesmente descartado usando o formato de arquivo de imagem especial "[null:](files.html#null)". |

  magick thumbnail.gif -alpha set -gravity SouthEast \
          -define compose:outside-overlay=false \
          pagecurl_overlay.png -composite \
          pagecurl_mask.png  -compose DstIn -composite \
          pagecurl_thumbnail.png

[IM Output]
É claro que essas imagens não têm o mesmo tamanho da nossa miniatura, nem provavelmente de qualquer imagem à qual você queira aplicá-las, mas isso não importa, pois podemos usar algumas opções extras para garantir que funcionem como esperado. Especificamente, o ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" garante que as duas imagens de sobreposição sejam posicionadas no canto inferior direito. E o ajuste Define especial 'compose:outside-overlay=false' impedirá que a imagem de máscara apague as partes da imagem não cobertas pela imagem menor. Consulte Ajuste Outside-Overlay para uma descrição completa. Se você quiser aplicar isso a muitas imagens, pode usar o "magick mogrify", empregando uma técnica especial que envolve o uso de "[-draw](https://imagemagick.org/command-line-options/#draw)" para fazer a Composição Alfa do Mogrify. No entanto, esse método de composição não entende o ajuste define especial, então funcionará apenas com imagens, sobreposições e máscaras que sejam todas do mesmo tamanho.

  pagecurl -e 0.5 -i /tmp/pagecurl  {_uma imagem_} null:
  magick mogrify {_opções -format e -path do magick mogrify_} -alpha set \
          -draw 'image Over 0,0 0,0 "/tmp/pagecurl_overlay.png"' \
          -draw 'image DstIn 0,0 0,0 "/tmp/pagecurl_mask.png"' \
          {_todas as imagens a serem dobradas_}...

Sobreposição de Canto Elaborada

Aqui olhamos um pouco mais a fundo o uso dessa técnica de "dupla máscara" para modificar uma imagem de maneiras diferentes em áreas diferentes, em vez de aplicar uma única máscara ou moldura grande à imagem inteira. Neste caso, vamos aplicar dupla máscara apenas nos cantos. O restante da borda (para combinar) é adicionado separadamente. [IM Output] As imagens de canto que vou usar foram geradas a partir da fonte original (mostrada à direita), que encontrei na DIY Frames Section da Anthony's Icon Library. Há outras nesta seção, então talvez você queira dar uma olhada. Se você encontrar algo na internet, avise-me, pois gosto de colecionar cantos e técnicas de acabamento interessantes. [IM Output] [IM Output] Uma imagem de sobreposição de cor e de máscara foi gerada a partir dessa imagem inicial, para que pudéssemos usar a técnica Pintar & Mascarar para sobrepor o canto na imagem. Note que essas imagens na verdade não usaram nenhum pixel semitransparente, nem sequer qualquer sombreamento de cores. Assim, essa borda elaborada pode ser usada para produzir miniaturas "GIF" de aparência limpa para páginas web. A complicação de usar máscaras de canto é que elas mascaram apenas os cantos da imagem original. Por causa disso, a imagem original precisa primeiro receber o conjunto apropriado de cores de borda extras. Depois disso, as duas máscaras de canto devem ser compostas em cada um dos cantos da imagem expandida. |

  magick thumbnail.gif   -alpha set  -compose Copy \
          -bordercolor Black  -border 2 \
          -bordercolor Sienna -border 3 \
          -bordercolor Black  -border 1 \
          -bordercolor None   -border 2 \
          -bordercolor Black  -border 2 \
          -bordercolor Peru   -border 3 \
          -bordercolor Black  -border 1 \
          \
          -compose Over \
          \( fancy_add.gif             \) -gravity NorthWest -composite \
          \( fancy_add.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_add.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_add.gif -flip -flop \) -gravity SouthEast -composite \
          -compose DstOut \
          \( fancy_sub.gif             \) -gravity NorthWest -composite \
          \( fancy_sub.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_sub.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_sub.gif -flip -flop \) -gravity SouthEast -composite \
          fancy_border.gif

[IM Output]
| Note que, para preservar a borda transparente que está sendo adicionada, você deve definir o ajuste "[-compose](https://imagemagick.org/command-line-options/#compose)" como 'Copy' em vez do padrão 'Over'. Se não fizer isso, a transparência será preenchida pela próxima cor de borda adicionada, neste caso com 'Black'. Consulte o Operador de Borda para detalhes.
---|---
A beleza de usar apenas máscaras de canto é que qualquer imagem de qualquer tamanho pode ser emoldurada com essa técnica, desde que seja grande o suficiente para as máscaras de canto que estão sendo adicionadas. Ou seja, você não fica limitado pelo tamanho das imagens de moldura que tem disponíveis. É claro que cada uma das quatro imagens de canto e as bordas são iguais em todo o entorno da imagem, apenas rotacionadas. Ou seja, o efeito de sombra ou espessura é todo "para dentro". Para corrigir isso, você precisaria gerar uma peça de canto diferente para cada um dos cantos, e a adição das bordas extras ao redor da imagem original teria de ser assimétrica. Basicamente, torna-se muito mais complexo, de modo a produzir efeitos de sombreamento verdadeiros. Uma solução melhor pode ser remover o efeito de sombra da peça de canto, aplicá-la como antes, mas depois adicionar efeitos de sombra globalmente. É preciso cautela.

Emblema usando Pintar & Mascarar

O mesmo processamento de imagem do emblema visto anteriormente em Sobreposição de Emblema e Emblema com Mascarar & Pintar também pode ser realizado pintando e depois mascarando. Aqui primeiro pintamos todas as cores e sombras na imagem, depois mascaramos a transparência final da imagem.

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_paint.png -composite badge_shape.png -compose DstIn -composite \
          badge_paint_mask.png

[IM Text] [IM Text] [IM Text] [IM Text]

Se isso parece desajeitado para esta imagem específica, você tem razão, é mesmo. A razão é que não só precisamos sombrear e realçar a imagem original, mas também precisamos preencher com preto quaisquer áreas que conterão efeitos de sombra. Especificamente, quaisquer partes que se tornarão totalmente transparentes (e somente os pixels que realmente sejam totalmente transparentes) precisarão ser pintadas de preto. Por outro lado, pixels semitransparentes com efeitos de sombra terão tanto um efeito de sombra parcial quanto uma máscara de transparência parcial. Em outras palavras, as sombras tornam desajeitada uma técnica de pintar e mascarar que de outra forma seria simples, na divisão dos efeitos de pintura e de mascaramento. É por isso que uma técnica de pintar e mascarar normalmente não é usada ao lidar com adições semitransparentes a uma imagem, como ao adicionar sombras ou estrelas de reflexo. Se a imagem não contivesse nenhum efeito de transparência, o processo de pintura não pareceria tão terrível e, em muitos casos, pode ser mais simples do que outras técnicas, pois você pode "cortar" as sobreposições pintadas com a máscara ao terminar. O exemplo da Dobra de Página foi um caso desses, pois usamos a máscara para aparar a sobreposição da dobra de página e formar um todo sem emendas. Note também a lacuna entre a região preta rígida e os efeitos de sombreamento na imagem de pintura. Essa lacuna reflete o aviso que mencionei antes sobre garantir que você não sobreponha os resultados de qualquer mascaramento interno com as bordas de qualquer máscara externa de pintura/sobreposição. É apenas neste caso específico que essa lacuna necessária se torna tão evidente. Para o próximo passo nos exemplos de "emblema", consulte Emblema usando Efeitos de Iluminação, que mescla as duas imagens de máscara em uma única imagem de máscara/sombreamento.

Técnica de Máscara de Iluminação

Botão de Bolha de Vidro

O próximo nível de complexidade no processamento de miniaturas é a aplicação de efeitos de iluminação muito complexos. A dificuldade aqui não é tanto a aplicação de um efeito de iluminação a uma imagem, mas a geração do efeito de sombreamento apropriado. Por exemplo, usando um Efeito Aqua você pode dar a uma miniatura um efeito de sombreamento muito complexo que a faz parecer envolvida por uma "bolha" de vidro. Além disso, isso funciona melhor com uma miniatura que tenha Cantos Arredondados. Vamos então gerar uma máscara de cantos arredondados para nossa imagem de miniatura, usando uma cor cinza pura. |

  magick thumbnail.gif -alpha off -fill white -colorize 100% \
     -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
     \( +clone -flip \) -compose Multiply -composite \
     \( +clone -flop \) -compose Multiply -composite \
     -background Gray50 -alpha Shape    thumbnail_mask.png

[IM Output]
Agora que temos uma "máscara de forma" em cinza puro que queremos usar, posso aplicar o efeito Efeito Aqua para gerar uma sobreposição de iluminação para essa forma. |

  magick thumbnail_mask.png -bordercolor None -border 1x1 \
          -alpha Extract -blur 0x10  -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 \
          thumbnail_lighting.png

[IM Output]
Com uma imagem final de sobreposição de luz/sombra como a acima, podemos aplicá-la facilmente a qualquer imagem de miniatura do tamanho certo. |

  magick thumbnail.gif -alpha Set thumbnail_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          glass_bubble.png

[IM Output]
Isso não apenas adiciona os efeitos de sombreamento apropriados a qualquer miniatura deste tamanho, mas a mesma imagem de iluminação mascara a miniatura na forma adequada. É importante notar que apenas os canais de cor são usados para aplicar o efeito de iluminação; o canal alfa não é usado nesse processo. Da mesma forma, ao mascarar, apenas o canal alfa é usado, não os canais de cor. Sem essa separação de canais para efeitos diferentes, você não obterá o resultado correto. Para uma discussão sobre a extração de um efeito de iluminação a partir de imagens, consulte o tópico do fórum de usuários do IM Extracting light layer from two images.
Isso, no entanto, pode ir muito mais longe, pois também podemos adicionar efeitos de sombra diretamente a essa máscara de iluminação. A cor adicionada, porém, deve ser preto puro, e você precisa garantir que a composição de efeito de iluminação escolhida torne uma imagem perfeitamente preta se a máscara de iluminação for preta. No entanto, é assim que os efeitos de sombra são normalmente adicionados a uma imagem, de modo que você pode simplesmente adicionar sombras diretamente à "máscara de efeito de iluminação", e tudo ficará bem! O mesmo vale para adicionar "reflexos" de iluminação, mas usando apenas pixels brancos para a sobreposição de reflexo. Em essência, uma "imagem de efeito de iluminação" pode novamente mesclar as duas imagens Mascarar & Pintar de volta em uma única imagem. Como você verá no próximo exemplo.

Emblema usando Efeitos de Iluminação

Usando as imagens da técnica Emblema usando Mascarar & Pintar, apliquei-as a uma imagem de tela cinza pura, de modo a gerar rapidamente uma imagem de "efeito de iluminação mascarado". Na verdade, eu também poderia ter usado o outro estilo de mascaramento (Emblema usando Pintar & Mascarar) com a mesma facilidade. Em seguida, aplico a imagem de máscara única à miniatura, reproduzindo o resultado desejado.

  # mescla as imagens "mascarar & pintar" com uma imagem cinza,
  # para criar uma "máscara de iluminação"
  magick -size 90x90 xc:gray50 -alpha set \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_lighting.png

  # Aplica a "máscara de iluminação" única
  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          badge_final.png

[IM Text] [IM Text] [IM Text]

Na verdade, eu gosto bastante dessa forma de mascaramento, pois a própria imagem de máscara parece quase idêntica à imagem que você deseja, apenas faltam as cores. Isso é, afinal, como uma máscara de iluminação é criada: basta aplicar os efeitos a uma imagem cinza perfeita, e você obtém uma imagem de "máscara de iluminação". Apenas lembre-se de que, com essa técnica específica, a sombra semitransparente deve ser preto puro para funcionar corretamente. Você não pode usar uma cor cinza para nenhum pixel que não contenha pelo menos parte da imagem original. Todas as áreas transparentes e semitransparentes devem ter cor branca ou preta pura, com o nível apropriado de transparência alfa. Por que apenas uma imagem funciona? Anteriormente precisávamos de duas imagens! A resposta é que a imagem de máscara está limitada a adicionar apenas tons de cor preto ou branco puros. Ao fazer isso, o efeito de sombreamento (iluminação) e sua máscara são essencialmente mesclados no componente de cor da "Máscara de Efeito de Iluminação". Como resultado disso, o canal alfa fica livre para conter a máscara de transparência anteriormente separada para a imagem final. A limitação disso, no entanto, é que você só pode adicionar tons de branco e preto à imagem. Você não pode adicionar, por exemplo, uma cor cinza à imagem que está sendo mascarada. Note, porém, que é possível adicionar alguns matizes de cores primárias e secundárias de algum espaço de cor, mas apenas de forma limitada, e eu nunca vi isso ser usado. Em resumo, você não pode adicionar cores específicas ou bordas elaboradas à imagem, apenas tons e sombras, realces e reflexos, ou texto simples em preto ou branco. No entanto, você não deve tentar misturar ou sobrepor efeitos de branco e preto adicionados, pois os pixels cinza resultantes de anti-serrilhamento entre os dois produzem uma cor sombreada da imagem subjacente, e não a cor cinza esperada. Essa é a desvantagem dessa técnica!

Mascarando imagens com distorções...

O que é ainda mais incrível é que, como as cores de sombreamento são apenas uma imagem em escala de cinza, você pode comprimir os efeitos de iluminação em apenas um canal de cor e a máscara do canal alfa. Isso pode então ser usado para liberar dois canais de cor da imagem para outros efeitos de processamento de imagem! Ou seja, você pode armazenar outras coisas na única "imagem de máscara". Especificamente, você pode adicionar efeitos de distorção na mesma imagem de máscara! Para mais informações sobre isso, consulte Imagem de Distorção Unificada, que faz exatamente isso! Uma espécie de imagem de máscara definitiva.


Emoldurar usando Imagens de Borda

[IM Image] Uma forma comum de adicionar uma borda complexa a uma imagem é usar imagens de moldura previamente preparadas, para produzir uma moldura como a do exemplo mostrado (à direita). No entanto, também é preciso ter cuidado ao gerar molduras. Se olhar com atenção para o exemplo dado, notará que ele não está totalmente correto. A sombreação da moldura gerada está de facto incorreta. As bordas esquerda e inferior da moldura deveriam ser trocadas para produzir uma moldura corretamente sombreada para uma típica fonte de luz no canto superior esquerdo. Assim, antes mesmo de começarmos, gostaria de sublinhar a importância de usar a imagem correta, ou a imagem corretamente modificada, para cada borda ao emoldurar a sua miniatura ou fotografia. É muito fácil errar, por isso verifique bem os seus resultados quando pensar que os acertou.

As Imagens de Borda da Moldura

Há muitos tipos de imagens que podem ser usados para emoldurar uma imagem. Por exemplo, aqui está uma moldura «preta fina com acabamento dourado» que foi modificada a partir de imagens fornecidas por Michael Slate .

[IM Image] [IM Image]

Há duas imagens, para proporcionar dois efeitos de iluminação diferentes, uma para as bordas superior e esquerda, a outra para as bordas inferior e direita. No entanto, as cores ao longo do comprimento da imagem não variam. Assim, pode-se tanto ladrilhar como esticar esta moldura para produzir o comprimento necessário. Um conjunto semelhante de peças de moldura são estas imagens de borda ladrilhável «dourada fina ornamentada».

[IM Image] [IM Image]

Como estas imagens têm alguns detalhes finos, não se pode simplesmente esticar a imagem até ao comprimento desejado. Nem se pode apenas Rotacionar Retangularmente estas peças para produzir as peças da outra borda, pois fazê-lo tornará errada a sombreação dos detalhes finos. Uma distorção de Transposição Diagonal, porém, deverá obter a sombreação correta para as outras bordas. Aconselha-se cuidado extra ao rever os seus resultados, para se certificar de que tanto a sombreação geral como a sombreação dos detalhes finos estão corretas nos quatro lados da imagem. Por fim, uma imagem de moldura pode consistir apenas numa única imagem que pode ser usada para gerar todas as bordas da moldura, como esta imagem de moldura ladrilhável «bambu».

[IM Image]

A razão pela qual só é necessária uma imagem é que a moldura não tem um «interior» ou «exterior» específicos. Contudo, a moldura tem efeitos de iluminação tanto gerais como de detalhe fino, o que exige que se tenha novamente cuidado com a forma de rotacionar/inverter/transpor a imagem para as outras bordas. O maior problema com esta moldura é que, se apenas a ladrilhar de forma simples, o detalhe macro torna-se muito regular e, por isso, poderá ser necessário aleatorizar o deslocamento do ladrilho, ou até aleatorizar os comprimentos das peças que são acrescentadas, de modo a dar-lhe um aspeto mais natural. Mais sobre isto adiante. Como pode ver, as imagens de moldura podem vir numa variedade de estilos, e deve ter-se cuidado ao tratar as imagens de borda escolhidas da forma correta (no que respeita à imagem de iluminação) ao gerar as outras imagens de borda em falta.

Alongar as Peças da Moldura

Ora, em qualquer uso destas imagens de moldura, precisaremos de criar peças mais longas que cubram o comprimento das dimensões da imagem. Só há duas formas básicas de fazer isto. Pode-se simplesmente esticar a imagem da moldura usando redimensionar (sem preservação da proporção) de modo a obter os comprimentos certos. Isto funciona para o primeiro conjunto de peças mostrado acima, que não têm detalhe interno, mas não é apropriado para nenhuma das outras imagens de moldura apresentadas. Basicamente, distorcerá o detalhe interno e pode tornar-se uma distração no aspeto da imagem final. No entanto, o outro método de alongamento, o ladrilhamento, pode ser usado para qualquer imagem de moldura que tenha um padrão ou detalhe repetido, o que é o caso de todas as imagens apresentadas acima. Se estiver a criar as suas próprias peças de moldura, tenha cuidado para que os ladrilhos encaixem corretamente, e num limite de pixel, de modo a garantir que tem uma cor uniforme e um ciclo adequado do detalhe nas suas imagens de moldura. Se não o fizer, pode obter uma junta de aspeto artificial entre os ladrilhos, que se torna óbvia por causa da repetição dos ladrilhos. No mundo real, os enquadradores também têm o mesmo problema ao juntar peças para fazer peças mais longas. Basicamente, é muito fácil obter dois tons de madeira diferentes, ou padrões de veio muito diferentes, que, quando unidos em «cauda de andorinha», tornam a junta muito óbvia. Portanto, não está mesmo sozinho neste problema. As imagens de moldura «bambu» terão de ser ladrilhadas. Ainda assim, como o detalhe está restrito a uma pequena área da imagem, pode obter alguns efeitos interessantes de ladrilhamento aleatório, que poderão necessitar de algum alongamento e encurtamento aleatorizados das peças para eliminar. Não vou aprofundar isto, porém, e deixá-lo-ei como exercício para os que o forem. Para os nossos exemplos, e porque funciona para praticamente todas as imagens de moldura, usarei um método simples de ladrilhamento constante para gerar os comprimentos de borda mais longos necessários.

Append Demasiado Simplista

Podemos simplesmente alongar a moldura simples «bambu» acima, ladrilhando-a até ao comprimento certo, e depois concatenar (append) as imagens em conjunto. O ladrilhamento é feito simplesmente pelo gerador especial de imagens Canvas Ladrilhado «[tile:](canvas.html#tile)» para ladrilhar uma imagem que está a ser lida. |

  magick thumbnail.gif \
          \( -size 90x14  tile:bamboo.gif -transpose \) \
          \( -size 90x14  tile:bamboo.gif -transpose \) -swap 0,1 +append \
          \( -size 148x14 tile:bamboo.gif \) \
          \( -size 148x14 tile:bamboo.gif \) -swap 0,1 -append \
          frame_append.gif

[IM Output]
Note que os tamanhos usados nos dois exemplos acima foram calculados com base na largura conhecida (10 pixels) da imagem de moldura e no tamanho da imagem a emoldurar (120x100 pixels). Terá de ajustar os argumentos de redimensionamento de forma apropriada para as suas imagens. Um problema ao ladrilhar peças de moldura (como o bambu) é que todas as bordas parecem cópias exatas umas das outras! Ou seja, a moldura parece artificial. Na vida real, a moldura terá sido cortada com deslocamentos praticamente aleatórios, a partir de peças mais longas de madeira real, ou neste caso de bambu. Para corrigir isso, também terá de dar a esses ladrilhos um Deslocamento de Ladrilho ligeiramente diferente para cada borda da imagem. |

  magick thumbnail.gif \
          \( -size 90x14  -tile-offset +50+0 tile:bamboo.gif -transpose \) \
          \( -size 90x14  -tile-offset +0+0  tile:bamboo.gif -transpose \) \
          -swap 0,1 +append \
          \( -size 148x14 -tile-offset +70+0 tile:bamboo.gif \) \
          \( -size 148x14 -tile-offset +25+0 tile:bamboo.gif \) \
          -swap 0,1 -append       frame_tile_offset.gif

[IM Output]
Este método de emoldurar não é assim tão mau para este tipo específico de imagem de borda, embora para outros tipos de molduras possa ficar com um aspeto muito ridículo. Basicamente, os cantos não estão corretos e, para a maioria das molduras, quer-se realmente que as imagens de borda se encontrem numa junta de ângulo de 45 graus, tal como aconteceria num verdadeiro quadro emoldurado. Uma solução para isto é pré-gerar manualmente imagens de canto apropriadas que possamos agora sobrepor a esta imagem para a tornar correta. Isto funciona bem para uma imagem de moldura esticável simples (como a imagem de moldura «preta fina»), mas falhará bastante mal para uma imagem ladrilhável como o «bambu», pois a imagem de canto provavelmente não encaixará corretamente na imagem do ladrilho. A melhor forma é gerar as juntas de canto diretamente a partir das imagens de borda ladrilhadas. E mostrar-lhe-ei métodos de fazer isto adiante.

Emoldurar por Sobreposição Estendida

Também pode fazer com que este tipo de emoldurado de borda fique ainda melhor estendendo as molduras para além dos limites da imagem original. Isto vê-se frequentemente num quadro do tipo «Home-Sweet-Home». Para o fazer, terá primeiro de ampliar a imagem original com bastante espaço extra no qual as peças de moldura mais longas são sobrepostas.

  magick thumbnail.gif -alpha set -bordercolor none -border 34 \
          \( -size 144x14 -tile-offset +30+0 tile:bamboo.gif -transpose \) \
          -geometry +20+10 -composite \
          \( -size 144x14 -tile-offset +45+0 tile:bamboo.gif -transpose \) \
          -geometry +154+0 -composite \
          \( -size 178x14 -tile-offset +60+0 tile:bamboo.gif \) \
          -geometry +0+20 -composite \
          \( -size 178x14 -tile-offset +0+0  tile:bamboo.gif \) \
          -geometry +10+124 -composite \
          frame_overlaid.gif

[IM Output]

Note que as medidas e o posicionamento para este tipo de emoldurado não são simples, e poderiam beneficiar de alguma aleatorização, tal como codifiquei fixamente no exemplo acima. Também pode melhorar ainda mais o aspeto arredondando as extremidades dos comprimentos de moldura, com alguma sombreação adicional e apropriada. Uma forma bastante melhor de emoldurar imagens desta maneira é gerar a imagem da moldura como uma unidade completa, e apenas sobrepô-la a uma imagem de tamanho fixo (ver Sobreposição Simples de Borda). No entanto, fazer isto significa que já não pode aleatorizar ligeiramente os comprimentos e a posição de cada peça de moldura.

Juntas de canto a 45 graus

A melhor solução é, de alguma forma, adicionar as imagens de moldura à volta da miniatura de modo a criar de facto uma junta de 45 graus em cada um dos cantos da moldura. Isto não é fácil, e passei por vários métodos de desenho e mascaramento até redescobrir um operador mágico chamado Moldura, Bordas tipo 3D. A solução foi então simples. Ler a imagem e aplicar-lhe «[-frame](https://imagemagick.org/command-line-options/#frame)», para criar um modelo das áreas a emoldurar. |

  magick thumbnail.gif -alpha set -bordercolor none \
          -compose Dst_Out -frame 15x15+15  frame_template.gif

[IM Output]
Ora, note que este modelo tem algumas características interessantes. Primeiro, é transparente no meio, onde ficará a imagem principal. Segundo, tem quatro e apenas quatro cores distintas que definem cada área na qual queremos colocar as nossas imagens de moldura. Não gera pixels de «anti-aliasing» de cores variadas nos cantos. Note que, para facilitar as coisas, a largura dessas áreas (15 pixels) é a largura das peças de moldura que iremos adicionar à imagem. Se as bordas verticais tivessem uma espessura diferente das bordas horizontais, esta técnica não funcionaria muito bem. De facto, poucos métodos funcionariam bem numa situação dessas. Esta imagem é o modelo de emoldurado e, ao ladrilhar cada uma das nossas peças de moldura nas quatro áreas de cores diferentes usando Primitivas de Preenchimento de Cor, obteremos as nossas juntas de canto a 45 graus, de forma muito simples e fácil. Por exemplo... |

  magick frame_template.gif \
          -tile blackthin_top.gif -draw 'color 1,0 floodfill' \
          frame_top_filled.gif

[IM Output]
Pode repetir este processo para as outras três bordas. Usando transposições para garantir que os realces e as sombras do detalhe interno permaneçam corretos. |

  magick frame_template.gif \
          -tile blackthin_top.gif   -draw 'color 1,0 floodfill' \
          -tile-offset +0+105 -tile blackthin_btm.gif \
                                       -draw 'color 15,105 floodfill' \
          -transpose \
          -tile blackthin_top.gif      -draw 'color 1,0 floodfill' \
          -tile-offset +0+135 -tile blackthin_btm.gif \
                                       -draw 'color 15,135 floodfill' \
          -transpose \
          -gravity center thumbnail.gif -composite frame_filled.gif

[IM Output]
A partir de uma discussão no fórum do IM 45 degree frame joints foi encontrada uma solução mais simples, envolvendo a pré-rotação da borda inferior. Aqui está o exemplo completo, usando o Registo em Memória para guardar imagens intermédias. |

  magick thumbnail.gif                -write mpr:image    +delete \
          goldthin_top.png             -write mpr:edge_top +delete \
          goldthin_btm.png -rotate 180 -write mpr:edge_btm +delete \
          \
          mpr:image -alpha set -bordercolor none \
          -compose Dst -frame 25x25+25  -compose over \
          \
          -tile mpr:edge_btm \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          -tile mpr:edge_top \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          \
          mpr:image -gravity center -composite    frame_gold.png

[IM Output]
Como pode ver, ainda temos um problema: fica com um aspeto muito artificial nos cantos superior esquerdo e inferior direito, devido a um efeito de espelho diagonal que resulta do ladrilhamento. Para corrigir isto, precisamos de adicionar um «[-tile-offset](https://imagemagick.org/command-line-options/#tile-offset)» aleatorizado, de modo a remover este efeito de espelho. | A definição de Deslocamento de Ladrilho estava avariada antes da versão 6.3.9-9 do IM, na medida em que o deslocamento 'X' era usado tanto para os valores de deslocamento 'X' como 'Y' (o valor 'Y' dado era ignorado). Isto significa que o exemplo acima provavelmente ladrilhará incorretamente as bordas inferior e direita, em versões mais antigas do IM.
---|---
Versão em ScriptIsto precisa de ser reescrito usando o último exemplo como modelo É claro que pode fazer tudo o que está acima num único comando. No entanto, façamo-lo de forma programada num script. Esta versão usa algum código inline para gerar imagens de borda apropriadas a partir das imagens de base fornecidas, usando Distorções Simples e alguns Rolamentos de Imagem aleatorizados para melhorar o aspeto geral da imagem ladrilhada. Estes podem ser ajustados dependendo do tipo de imagem de moldura de borda que foi fornecida. As imagens de borda processadas são então ladrilhadas usando uma técnica de Imagem de Ladrilho em Memória, e o modelo de moldura (gerado) é usado para mascarar essas imagens, como fizemos acima.

  image=thumbnail.gif
     image_w=`magick $image -format %w info:`
     image_h=`magick $image -format %h info:`

  top=goldthin_top.png
  btm=goldthin_btm.png

     width=`magick $top -format %h info:`
     length=`magick $top -format %w info:`

  # Tamanho da nova imagem ( usando aritmética de inteiros do BASH )
  new_size=$(($image_w+$width*2))x$(($image_h+$width*2))

  # Opções do IM para ler uma versão «rolada aleatoriamente» para as peças de borda
  lft="( $top -roll +$(($RANDOM % $length))+0  -transpose )"
  rht="( $btm -roll +$(($RANDOM % $length))+0  -transpose )"

  # Opções do IM para «rolar aleatoriamente» as peças superior e inferior
  top="( $top -roll +$(($RANDOM % $length))+0 )"
  btm="( $btm -roll +$(($RANDOM % $length))+0 )"

  # Emoldurar a imagem num único comando do IM....
  magick -page +$width+$width  $image  +page -alpha set \
    \( +clone -compose Dst -bordercolor none -frame ${width}x$width+$width \
       -fill none -draw "matte 0,0 replace" \
          -flip   -draw "matte 0,0 replace"   -flip \) \
    \( $top $btm -append -background none -splice 0x${image_h}+0+$width \
       -write mpr:horz +delete -size $new_size tile:mpr:horz +size \
       -clone 1  -compose DstOut -composite \) \
    \( $lft $rht +append -background none -splice ${image_w}x0+$width+0 \
       -write mpr:vert +delete -size $new_size tile:mpr:vert +size \
       -clone 1  -compose DstIn -composite \) \
    -delete 1  -compose Over  -mosaic   framed_script.png

[IM Output]

E aqui temos uma imagem perfeitamente emoldurada com juntas de canto a 45 graus, com deslocamentos de ladrilho aleatorizados. Sim, é um exemplo complexo. Mas isso é para permitir o uso de Imagens de Ladrilho em Memória, para que possamos pré-processar as imagens de moldura, tudo no mesmo comando. Isto torna-o mais complexo, mas também mais versátil. O código acima foi incorporado num script de shell, que pode descarregar («[frame_edges.tar.gz](../static/img/scripts/frame_edges.tar.gz)» a partir do diretório IM Example Scripts). Este ficheiro tar inclui o script e um conjunto de imagens de moldura que o script sabe processar e usar. Também adiciona uma borda de «cartão» entre a moldura e a imagem propriamente dita.

Exemplo futuro

Usar bordas ladrilhadas com peças de canto correspondentes. As imagens de borda terão de corresponder a peças de canto previamente preparadas, mas também de ladrilhar de forma harmoniosa ao longo do comprimento fixo da imagem. Isso significa que toda a borda ladrilhada poderá necessitar de algum esticamento ou compressão de modo a alinhar os ladrilhos da borda com as suas peças de canto. Para funcionar corretamente, os ladrilhos da borda têm de se repetir pelo menos 3 ou 4 vezes ao longo da borda mais pequena da imagem. Um exemplo deste tipo de borda/canto ladrilhado é a implementação de uma borda de efeitos de «folhas» ou «fleur».