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

Exemplos do ImageMagick -- Anotando Imagens

Prefácio e Índice dos Exemplos do ImageMagick
Rotulando Imagens (técnicas para rotular imagens)

Este documento apresenta várias maneiras de anotar uma imagem grande com texto ou com alguma outra imagem. A anotação pode ser marcante e bastante visível, ou sutil e discreta. As razões para anotar imagens variam, mas geralmente consistem em

  • Marcar a imagem com informações sobre o que ela representa.
  • Apontar ou destacar algum aspecto da imagem.
  • Adicionar direitos autorais ou logotipos à imagem como forma de proteção contra cópia.

O ImageMagick oferece muitas maneiras de fazer essas coisas, mas nem todas são fáceis de descobrir sozinho a partir dos manuais. Esta página procura apresentar os métodos comumente usados. Muitos dos métodos específicos são tratados com mais detalhe em outras páginas de exemplos. Se você tiver interesse em anotar ou aplicar marca d'água a uma animação GIF, sugerimos ler primeiro este documento e depois ir para Anotando animações GIF para começar.


Anotando Imagens

O problema básico ao rotular uma imagem é fazê-lo de modo que o texto seja legível independentemente de como a imagem seja. A seguir são mostrados muitos métodos, alguns dos quais podem ser expandidos para tarefas mais complexas. Nestes exemplos, a explicação limita-se à fonte padrão do ImageMagick. Recomenda-se usar diferentes fontes e tamanhos de ponto adequados ao que se deseja alcançar.

Rotular abaixo (ou acima) de uma imagem

Anexar um rótulo com centralização já é possível, a partir do IM v6.4.7-1, pois a anexação de imagens agora segue a configuração de gravity para fins de alinhamento. |

  magick dragon.gif   -background Khaki  label:'Faerie Dragon' \
          -gravity Center -append    anno_label.jpg

[IM Output]
Reordenando as imagens, é possível anexar o rótulo acima da imagem. |

  magick dragon.gif   -background Orange  label:'Faerie Dragon' \
          +swap  -gravity Center -append    anno_label2.jpg

[IM Output]
Splice e Draw é uma maneira muito simples de adicionar espaço extra a uma imagem para permitir desenhar/anotar o rótulo na própria imagem. |

  magick dragon.gif \
          -gravity South   -background Plum   -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice.gif

[IM Output]
O mesmo método pode ser usado para desenhar um rótulo acima da imagem; basta substituir a configuração de gravity 'South' por 'North'. Fácil! |

  magick dragon.gif \
          -gravity North   -background YellowGreen  -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice2.gif

[IM Output]
O operador "[-draw](https://imagemagick.org/command-line-options/#draw)" não é mais recomendado para desenhar diretamente sobre imagens, a menos que faça parte de funções de desenho mais complexas. Consulte a seção Tratamento de Texto em Imagens para mais detalhes sobre outros métodos e técnicas de desenho de texto. Rótulo usando Montage O comando montage no ImageMagick é frequentemente considerado pelos usuários útil apenas para criar uma exibição de um diretório inteiro de imagens. Na verdade, ele oferece uma maneira muito simples de adicionar rótulos a uma imagem. |

  montage -label "Faerie Dragon"  dragon.gif \
          -geometry +0+0 -background Gold anno_montage.jpg

[IM Output]
O montage também pode adicionar uma moldura e outros elementos à imagem, de modo que essa forma de rotulagem oferece muitas possibilidades adicionais além da simples rotulagem da imagem. |

  montage -label "Faerie Dragon" dragon.gif \
          -font Candice -pointsize 15 \
          -frame 5  -geometry +0+0 anno_montage2.jpg

Para mais informações sobre o uso do montage, consulte Montage, Matrizes de Imagens. [IM Output]
Rótulo usando Polaroid Uma alternativa ao uso do montage é usar a Transformação de Imagem Polaroid para gerar uma imagem comentada bastante elaborada. |

  magick -caption "Faerie Dragon" dragon.gif -gravity center \
           -background black +polaroid anno_polaroid.png

Atenção: esta imagem é distorcida (curvada e rotacionada) com alguma aleatoriedade, de modo que o tamanho final da imagem pode variar, a menos que a rotação seja desabilitada. Ela também contém efeitos complexos de sombra e transparência, por isso uma imagem no formato PNG foi usada para salvar o resultado. [IM Output]
É possível reduzir a 'imprecisão' na imagem resultante causada pela rotação usando a técnica de 'Super Amostragem'. Consulte Transformação de Imagem Polaroid para ver um exemplo disso.

Rotular sobre a própria imagem...

O problema de escrever texto diretamente sobre uma imagem é que não há como garantir que o texto será legível na cor escolhida. A imagem sobre a qual se desenha pode ser preta, branca ou um arco-íris de cores. Rótulo com contorno: O método mais simples é desenhar o texto com um contorno para separá-lo da imagem. No entanto, como a configuração de fonte "[-stroke](https://imagemagick.org/command-line-options/#stoke)" adiciona espessura à fonte tanto para dentro quanto para fora, reduzindo sua eficácia (consulte Stroke e StrokeWidth para mais informações). A melhor maneira de desenhar uma fonte com um contorno de fundo é desenhar o texto duas vezes. |

  magick dragon.gif -gravity south \
          -stroke '#000C' -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -stroke  none   -fill white    -annotate 0 'Faerie Dragon' \
          anno_outline.jpg

[IM Output]
Como se pode ver, funciona, mas não muito bem. Funciona melhor com uma fonte mais grossa do que a fonte padrão 'Times' ou 'Arial'. Para mais detalhes sobre essa técnica, consulte Fonte Composta com Traço Grosso. Desenhar uma caixa escurecida : O método mais clássico para tornar o texto anotado mais visível é 'escurecer' a imagem na área onde o texto será adicionado e, então, desenhar o texto na cor oposta. Por exemplo... |

  magick dragon.gif \
          -fill '#0008' -draw 'rectangle 5,128,114,145' \
          -fill white   -annotate +10+141 'Faerie Dragon' \
          anno_dim_draw.jpg

[IM Output]
Esse método funciona bem, mas, como se pode ver, neste exemplo optou-se por não usar "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para posicionar o texto, pois o retângulo escurecido não pode ser posicionado com gravity (isso pode mudar no futuro). Além disso, seu tamanho e posição podem depender da imagem e do tamanho final do texto, o que pode exigir alguns cálculos matemáticos adicionais. Caixa de cor de fundo (undercolor) : Em vez de tentar desenhar a caixa de fundo manualmente, é possível fazer o ImageMagick usar uma 'undercolor' na caixa. Consulte Caixa Undercolor de Texto. A 'undercolor' do texto (como usada na API da biblioteca) pode ser especificada na linha de comando com a opção "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". |

  magick dragon.gif  -fill white  -undercolor '#00000080'  -gravity South \
          -annotate +0+5 ' Faerie Dragon '     anno_undercolor.jpg

[IM Output]
Como se pode ver, isso é bem mais simples do que desenhar a caixa escurecida manualmente, embora se recomende um espaço extra no início e no fim do texto desenhado, para dar uma pequena folga à caixa. Rótulo por composição : A solução mais ideal é preparar uma imagem de texto de antemão e sobrepô-la como imagem. Aqui cria-se um rótulo simples sobre um fundo semitransparente e o sobrepõe. |

  magick -background '#00000080' -fill white label:'Faerie Dragon' miff:- |\
    magick composite -gravity south -geometry +0+3 \
              -   dragon.gif   anno_composite.jpg

[IM Output]
Essa última técnica tem algumas vantagens distintas. A caixa escurecida pode ser dimensionada para caber no rótulo e pode ser posicionada corretamente com "[-gravity](https://imagemagick.org/command-line-options/#gravity)", sem necessidade de conhecimento específico sobre a imagem à qual está sendo adicionada nem sobre a fonte usada no desenho.
Além disso, não há limitação a uma simples caixa escurecida. Em vez disso, é possível preparar uma imagem de fonte muito complexa, seja de antemão (para aplicá-la muitas vezes), seja na hora, por imagem. Praticamente todos os estilos de Efeitos de Fonte Compostos também estão disponíveis, permitindo tornar as adições de texto muito atraentes e de aparência profissional. Legenda com tamanho automático : Com o lançamento do IM v6.3.2, o "[caption:](text.html#caption)" passou a poder ajustar automaticamente o tamanho do texto para melhor se ajustar a uma caixa de tamanho específico. Mas, para aproveitar isso adequadamente em uma sobreposição, é preciso realmente saber qual é a largura da imagem que está sendo anotada. Aqui reúne-se essa informação e cria-se e sobrepõe-se uma legenda de modo que o texto seja dimensionado automaticamente para melhor se ajustar ao espaço disponível, com quebra de linha. |

  width=`identify -format %w dragon.gif`; \
  magick -background '#0008' -fill white -gravity center -size ${width}x30 \
          caption:"Faerie Dragons love hot apple pies\!" \
          dragon.gif +swap -gravity south -composite  anno_caption.jpg

[IM Output]
Essa técnica é ideal para sobrepor comentários a uma imagem, embora fazê-lo na linha de comando tenha problemas próprios, pois se está criando uma nova imagem, e não anotando uma imagem existente. Consulte Escapes de opção definidos pelo usuário para uma solução desse problema. Rótulo elaborado : Como exemplo final, sobrepõe-se um texto criado com uma fonte de contorno suave elaborada para garantir que permaneça visível, mas sem criar uma caixa retangular para a anotação. |

  magick -size 100x14 xc:none -gravity center \
          -stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -background none -shadow 100x3+0+0 +repage \
          -stroke none -fill white     -annotate 0 'Faerie Dragon' \
          dragon.gif  +swap -gravity south -geometry +0-3 \
          -composite  anno_fancy.jpg

[IM Output]
Se a intenção for compor o mesmo rótulo (por exemplo, uma mensagem de direitos autorais) em muitas imagens, provavelmente será melhor gerar o rótulo separadamente e compô-lo em cada imagem com o comando "mogrify". O deslocamento "-geometry +0-3" acima é usado para posicionar a sobreposição composta mais perto da borda, pois o contorno suave e difuso dessa imagem costuma ser maior do que o necessário.
Todos os exemplos acima devem, é claro, ser ajustados às suas próprias necessidades. Não seja um seguidor de rebanho fazendo o que todo mundo faz. Experimente e dê ao seu próprio site ou programa um toque distinto do de todos os outros. E, mais importante, conte à comunidade do IM sobre isso.

FUTURE: select the black or white color based on the images relative
intensity.  This uses a number if very advanced techniques.

  magick input.jpg  -font myfont -pointsize 25 \
      \( +clone -resize 1x1  -fx 1-intensity -threshold 50% \
         -scale 32x32 -write mpr:color +delete \)  -tile mpr:color \
       -annotate +10+26 'My Text'              output.jpg

Explanation:  Copy of image is resized to 1 pixel to find the images
average color.  This is then inverted and greyscaled using -fx, then
thresholded to either black or white, (as appropriate).
This single color pixel is now scaled to a larger tiling image, and
saved into a named memory register (mpr:).

The image is then used to set the fill tile, for the annotated text.
Their is however no simple method (at this time) to set the outline -stroke
color of the draw text to its inverse.

Other techniques are to use some text as a 'negate image' mask, or even a color
burn or color dodge compose operation, to distort the image with the text.

Sobrepondo Imagens O comando "magick composite" e o operador de imagem "[-composite](https://imagemagick.org/command-line-options/#composite)" no ImageMagick fornecem o principal meio de colocar uma imagem sobre outras de várias maneiras. Os detalhes desses métodos são apresentados na página de exemplos Composição Alfa. No entanto, há também operadores de nível mais alto que fazem uso da composição alfa de imagens. Entre eles estão Camadas de Imagem, bem como Posicionamento de Imagens com Gravity, mais adiante nesta página de exemplos. O método de composição padrão é "Over", que apenas sobrepõe a imagem de sobreposição sobre a imagem de fundo, tratando as transparências exatamente como se esperaria. A imagem de fundo também determina o tamanho final do resultado, independentemente de onde a sobreposição é colocada (com a opção "[-geometry](https://imagemagick.org/command-line-options/#geometry)"). Não importa se a sobreposição está no meio, saindo pela metade da imagem de fundo ou muito distante: a imagem de saída tem o mesmo tamanho da imagem de fundo. A posição geométrica da imagem também é afetada por "[-gravity](https://imagemagick.org/command-line-options/#gravity)", de modo que o posicionamento da imagem sobreposta pode ser definido em relação a qualquer uma de nove (9) localizações diferentes. Consulte "Posicionando Imagens e Texto" abaixo. Além do "[-geometry](https://imagemagick.org/command-line-options/#geometry)" da sobreposição composta, imagens individuais também podem ter informações de página ou de canvas (definidas com as opções "[-page](https://imagemagick.org/command-line-options/#page)" e "[-repage](https://imagemagick.org/command-line-options/#repage)"), que podem afetar a posição final das imagens. No entanto, essa informação específica da imagem não é afetada por "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Aos exemplos...Sobreposição é provavelmente a forma mais comum de anotação de imagem e é muito simples de fazer. Aqui sobrepõe-se um ícone 32x32 de um castelo no meio de uma moldura de botão previamente preparada.

  magick composite -gravity center  castle.gif  frame.gif  castle_button.gif

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

Também é possível posicionar as subimagens com exatidão. Aqui coloca-se uma mão para apontar as pequenas garras do dragão feérico.

  magick composite -geometry +31+105  hand_point.gif dragon.gif \
            dragon_claw_pointed.jpg

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

A forma exata como uma imagem é desenhada sobre o fundo é controlada pela configuração "[-compose](https://imagemagick.org/command-line-options/#compose)". O padrão, usado acima, é "-compose over", que apenas sobrepõe a imagem ao fundo. A maioria dos outros métodos de composição disponíveis não é muito útil, exceto em situações muito específicas, mas eis alguns deles. Para mais detalhes sobre essa configuração e seus efeitos, consulte Composição Alfa. Bumpmap é um método de composição delicado que, basicamente, escurece a imagem de fundo de acordo com o brilho da imagem de sobreposição. Tudo o que é branco na sobreposição é tratado como transparente, enquanto tudo o que é preto torna-se preto na imagem de saída. É um pouco como usar a sobreposição como um carimbo de tinta, e essa é uma boa maneira de visualizar essa operação. Como dica, a sobreposição com um bumpmap funciona melhor com imagens de cores claras. Por isso, pode ser necessário preparar a imagem de bumpmap antes de usar. Aqui redimensiona-se a imagem do dragão antes de usar "-compose bumpmap" para desenhá-la sobre a imagem de um pergaminho de papel.

  magick composite \( dragon.gif -resize 50% \) scroll.gif \
            -compose bumpmap -gravity center   dragon_scroll.gif

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

Bumpmaps também podem ser usados para aplicar um efeito geral a uma imagem; neste caso, distribui-se em mosaico um padrão de fundo de cor clara sobre o dragão. Lembre-se de que uma imagem de bumpmap é tratada como uma imagem em escala de cinza, de modo que qualquer cor na imagem de sobreposição é perdida.

  magick composite -compose bumpmap  -tile rings.jpg \
            dragon.gif  dragon_rings.jpg

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

| A opção "[-tile](https://imagemagick.org/command-line-options/#tile)" acima só funciona para operações de composição que usam o comando "magick composite". Em "magick", será necessário usar o gerador de imagens "[tile:](canvas.html#tile)" com um "[-size](https://imagemagick.org/command-line-options/#size)" para especificar a extensão. É claro que se pode tornar a imagem de origem sobreposta maior do que a imagem de fundo sobre a qual se sobrepõe, pois o resultado terá o tamanho da imagem de fundo (ou de destino).
---|---
O método de composição Multiply é mais conhecido por sua capacidade de mesclar duas imagens com fundos brancos (como sobre uma página de texto). Diferentemente do método de composição 'bumpmap', ele não converte previamente a imagem sobreposta para escala de cinza.

  mesgs PictureWords |\
      magick -pointsize 18 text:-  -trim +repage \
              -bordercolor white -border 10x5   text.gif
  magick composite -compose multiply -geometry +400+3 \
            paint_brush.gif  text.gif  text_multiply.gif

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

OBSERVAÇÃO: o comando complexo para gerar "text.gif" acima serve apenas para criar uma imagem típica somente de texto; o comando "mesgs" apenas produz uma citação específica, como faz o "fortune", mas com mais controle. Esse método funciona muito bem em muitas situações, mas geralmente apenas se uma (qualquer) das imagens for basicamente preta (ou em escala de cinza) sobre um fundo majoritariamente branco. Se ambas as imagens contiverem regiões coloridas, os resultados podem ser inesperados. Em outras palavras, essa técnica é perfeita para sobrepor desenhos de linha, diagramas ou imagens de texto sobre imagens brancas (ou de cor razoavelmente clara), como imagens de páginas impressas ou digitalizadas.


Marca d'água

A marca d'água é uma tarefa importante, pois oferece uma forma de marcar uma imagem como pertencente a alguma empresa ou site. Infelizmente, isso envolve degradar a imagem de alguma maneira, em prejuízo da própria imagem. Os objetivos básicos de uma marca d'água são

  • A marca deve ser claramente visível, independentemente de a imagem ser de cor clara ou escura.
  • Deve ser difícil de apagar.
  • E não deve ser incômoda demais para quem a vê.

Todos esses fatores estão em conflito, e essa é uma das razões pelas quais fazer uma marca d'água bem é tão difícil.

Marca d'água com símbolos

Uma das formas mais simples, e mais incômodas, de marca d'água é apenas colocar uma imagem muito pequena, porém específica, em algum ponto da imagem a ser marcada. Aqui gerou-se uma imagem (usando "logo:") que se deseja marcar, usando um pequeno símbolo de 'olhos'.

  magick logo: -resize x180  -gravity center  -crop 180x180+0+0  logo.jpg
  magick composite -geometry +160+13 eyes.gif   logo.jpg  wmark_symbol.jpg

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

A melhor abordagem para posicionar a imagem pequena é adicioná-la de modo que pareça realmente fazer parte da imagem original. No exemplo acima, a imagem dos "olhos" foi adicionada de modo a parecer quase parte do chapéu do mago (também não é desejável que ela se integre demais à imagem). Consequentemente, essa técnica exige o toque humano, o que a torna impossível de automatizar totalmente. A imagem pequena também pode ser muito difícil de remover, pois destrói completamente a parte da imagem que ela sobrepôs. E, se bem feita, quase não é perceptível, a menos que se esteja procurando por ela especificamente. Já a vi usada com bom efeito em muitos lugares na web. Certo site usava um pequeno símbolo em forma de adaga. As imagens roubadas desse site ficavam muito evidentes quando o mesmo símbolo de adaga era identificado em imagens encontradas em outros sites. Marca d'água com texto Simplesmente desenhar texto sobre uma imagem também é uma forma simples de marca d'água, e qualquer um dos exemplos de rótulo sobre a imagem acima pode ser usado como um tipo de marca d'água. No entanto, para fazer isso corretamente, deve-se usar duas cores diferentes para evitar que o texto desapareça quando desenhado sobre fundos de cores distintas. Assim, deve-se usar algum tipo de Efeitos de Fonte Compostos. |

  magick logo.jpg  -font Arial -pointsize 20 \
          -draw "gravity south \
                 fill black  text 0,12 'Copyright' \
                 fill white  text 1,11 'Copyright' " \
          wmark_text_drawn.jpg

Isso funciona bem e pode ser automatizado, mas é chamativo demais para servir como uma boa marca d'água, pois se destaca demais da imagem. [IM Output]
Mas, com alguma preparação, é possível criar uma imagem com fundo transparente que seja menos invasiva. Para detalhes das etapas usadas para gerar o texto da marca d'água, consulte Mascaramento de Fonte. Os exemplos de máscara em Mascaramento de Imagens também podem ser úteis para a compreensão.

  magick -size 300x50 xc:grey30 -font Arial -pointsize 20 -gravity center \
          -draw "fill grey70  text 0,0  'Copyright'" \
          stamp_fgnd.png
  magick -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
          -draw "fill white  text  1,1  'Copyright'  \
                             text  0,0  'Copyright'  \
                 fill black  text -1,-1 'Copyright'" \
          -alpha off stamp_mask.png
  magick composite -compose CopyOpacity  stamp_mask.png  stamp_fgnd.png  stamp.png
  magick mogrify -trim +repage stamp.png

[IM Output]

Agora que temos uma fonte de marca d'água, podemos aplicá-la à imagem... |

  magick composite -gravity south -geometry +0+10 stamp.png  logo.jpg \
            wmark_text_stamped.jpg

Como se pode ver, a marca d'água não é tão chamativa quanto antes e usa até tons de cinza em vez de branco e preto puros. Mesmo assim, permanece bastante visível independentemente do fundo. A página Efeitos de Fonte Compostos detalha muitos estilos de fonte que podem ser usados dessa forma sem sobrecarregar a imagem que está sendo marcada. [IM Output]
Também é possível distribuir o texto em mosaico por toda a imagem. Aqui evita-se também a necessidade de uma imagem intermediária usando uma 'pipeline' de comandos, em que a saída de um alimenta o seguinte. |

  magick -size 140x80 xc:none -fill grey \
          -gravity NorthWest -draw "text 10,10 'Copyright'" \
          -gravity SouthEast -draw "text 5,15 'Copyright'" \
          miff:- |\
    magick composite -tile - logo.jpg  wmark_text_tiled.jpg

Isso tira proveito do fato de que uma imagem (como uma fotografia, não um diagrama) geralmente tem algumas áreas nas quais o texto distribuído em mosaico será visível. Talvez se queira tornar o texto semitransparente para a própria marca d'água (usando, por exemplo, um cinza meio transparente como "'#80808080'"). Convém também manter essa técnica de mosaico em mente para as técnicas de marca d'água propriamente ditas apresentadas a seguir. [IM Output]

Marca d'água com imagens

O ImageMagick também oferece várias opções especificamente úteis para uma marca d'água mais sutil, sobre uma área maior. Em geral, é a isso que se refere mais comumente quando se 'aplica marca d'água' a uma imagem. À direita está uma imagem de "dragão d'água" usada nestas demonstrações. Ela tem alguma transparência, usada para verificar se o IM faz a coisa certa em relação à transparência, evitando qualquer aspecto 'quadrado' horrível nos resultados. [IM Output]
Antes da versão 6 do IM, as opções "-watermark" e "-dissolve" tinham falhas no tratamento do canal alfa (transparência) da imagem de sobreposição, produzindo efeitos muito estranhos.
--- ---
A composição Watermark foi concebida para aplicar marca d'água a imagens e, embora funcione, tende a funcionar apenas com imagens de sobreposição em branco e preto puros, produzindo artefatos de borda feios.
  magick composite -watermark 30% -gravity south \
            wmark_image.png  logo.jpg    wmark_watermark.jpg

Para informações mais detalhadas sobre essa opção, consulte a página Uso da Opção Watermark. [IM Output]
Constatou-se, por mim e por outros, que o Dissolve funciona melhor. |

  magick composite -dissolve 25% -gravity south \
            wmark_image.png   logo.jpg  wmark_dissolve.jpg

Isso funciona muito bem, mas partes da marca d'água desaparecerão em imagens com pixels em branco e preto puros. Ou seja, dissolver branco sobre branco e preto sobre preto não será visível na imagem final. Como essas duas cores são muito comuns, é melhor fazer algum pré-processamento adicional da marca d'água para que ela use vários tons de cinza em vez de branco e preto puros. (Veja "Dissolve acinzentado" abaixo.) [IM Output]
Para informações mais detalhadas sobre essa opção, consulte a página Uso da Opção Dissolve. Em mosaico (tiled): Também é possível distribuir a marca d'água em mosaico por toda a imagem de fundo, em vez de apenas adicioná-la em um único ponto. Basta substituir a posição de gravity por "[-tile](https://imagemagick.org/command-line-options/#tile)". É claro que, nesse caso, talvez se queira tornar a marca d'água ainda menos intrusiva. |

  magick composite -dissolve 15 -tile \
            wmark_image.png   logo.jpg  wmark_tiled.jpg

[IM Output]
Bumpmap acinzentado: Para usar o bumpmap corretamente como marca d'água, a imagem precisa de alguma preparação para tornar tanto o branco quanto o preto uma faixa de cinza mais clara, usando a técnica de Ajuste em Escala de Cinza. Se isso não for feito, o resultado ficaria muito, muito chamativo. |

  magick wmark_image.png  -fill Gray91 -colorize 80  miff:- |\
  magick composite -compose bumpmap -gravity south \
            -  logo.jpg    wmark_bumpmap.jpg

[IM Output]
O maior problema do bumpmap como marca d'água é que a operação só escurece uma imagem. Por isso, essa técnica é praticamente inútil para imagens muito escuras. Dissolve acinzentado: A mesma técnica de pré-processamento também pode ser útil com o método dissolve, de modo que as partes brancas da imagem de marca d'água escureçam ligeiramente sobre fundo branco e, do mesmo modo, as áreas pretas da marca d'água clareiem sobre as partes pretas da imagem. |

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 30 -gravity south -  logo.jpg wmark_dissolve_grey.jpg

[IM Output]
Esse resultado, diria-se, é quase ideal como marca d'água, satisfazendo todos os requisitos. Ainda assim, valeria a pena ajustar mais o dissolve final para tornar a marca d'água ainda menos perceptível. Dissolve acinzentado em mosaico: É exatamente como acima, mas distribuído em mosaico pela imagem com um valor de dissolve ainda mais baixo. |

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 15 -tile  -  logo.jpg wmark_dissolve_tile.jpg

[IM Output]
| O comando "magick composite" não sabe lidar com arquivos de múltiplas imagens, como animações. No entanto, outros métodos permitem fazer isso. Consulte Modificando Animações, Anotando para exemplos de anotação e sobreposição em arquivos de múltiplas imagens.
---|---


Posicionando Imagens e Texto com Gravity

A 'Gravity' da situação

Como se pode ver acima, poder posicionar imagens e texto dentro de uma imagem maior pode ser tão importante quanto qualquer outra coisa. Naturalmente, a configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)" é um dos aspectos mais importantes disso.

Na lista de discussão do ImageMagick, Tim Hunter declarou:
“ Gravity vai deixá-lo louco até você pegar o jeito. ”

Esse é um sentimento com o qual se concorda de todo o coração. Gravity só é aplicado nas seguintes situações...

  • Qualquer operação que envolva uma configuração do tipo 'geometry', como "[-crop](https://imagemagick.org/command-line-options/#crop)" e o posicionamento "[-geometry](https://imagemagick.org/command-line-options/#geometry)" de imagens para Composição Alfa, incluindo a Composição em Camadas de Múltiplas Imagens.
  • Também é usado como meio de especificar a justificação de texto pelos diversos geradores de texto em imagem, como "[label:](text.html#label)", e a justificação de texto pelos diversos geradores de texto em imagem, como "[caption:](text.html#caption)".
  • O operador de desenho de texto "[-annotate](https://imagemagick.org/command-line-options/#annotate)" também o utiliza para o posicionamento e a justificação do texto.
  • E, por fim, é usado pelo método "[-draw](https://imagemagick.org/command-line-options/#draw)" em seus métodos 'text' e "image', e SOMENTE nesses métodos.

No entanto, "[-gravity](https://imagemagick.org/command-line-options/#gravity)" NÃO é usado para

  • Quaisquer operadores de lista de imagens ou de camadas, como "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)", "[-flatten](https://imagemagick.org/command-line-options/#flatten)" e a maioria dos métodos "[-layers](https://imagemagick.org/command-line-options/#layers)", e especialmente não em animações GIF. Todas essas operações usam deslocamentos de imagem sobre um canvas virtual maior (definido com as configurações de metadados "[-page](https://imagemagick.org/command-line-options/#page)" e "[-repage](https://imagemagick.org/command-line-options/#repage)") para posicionar as imagens. Tais deslocamentos são sempre relativos ao canto superior esquerdo do canvas virtual da imagem. Nenhuma noção de "[-gravity](https://imagemagick.org/command-line-options/#gravity)" é usada nessa metodologia.
  • Qualquer outro método "[-draw](https://imagemagick.org/command-line-options/#draw)" não usa "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para posicionamento. Também é improvável que passe a usar, pois "[-gravity](https://imagemagick.org/command-line-options/#gravity)" não é definido no rascunho SVG que o IM segue para essas funções de baixo nível.

O que tudo isso significa? Primeiro, e mais importante, define o ponto de origem que "[-geometry](https://imagemagick.org/command-line-options/#geometry)" usa para posicionar o texto e as imagens sobrepostos em relação às bordas, aos lados e ao centro da imagem, sem que o usuário precise saber o tamanho real da imagem. Essa é a sua função principal. Em segundo lugar, define a justificação horizontal e vertical do objeto sobreposto (texto ou imagem) em relação a esse ponto de gravity definido. Por exemplo, com gravity 'East', o texto ou a imagem será posicionado à direita (justificação à direita) do ponto definido. Tecnicamente, a justificação deveria ser uma configuração separada de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", embora intimamente relacionada; no entanto, o IM atualmente combina ambas em uma única configuração. Há um esforço para separar os dois aspectos, de modo que, se uma configuração de "justification" estiver indefinida, ela recorra à configuração de "[-gravity](https://imagemagick.org/command-line-options/#gravity)" atual. Se você precisar disso, solicite ao Cristy (pela lista de discussão). Se um número suficiente de usuários pedir, certamente será implementado com o tempo.

Posicionamento de imagem usando Gravity

Eis um exemplo de uso do gravity para posicionar imagens sobre um fundo.

  magick composite label:Default                      rings.jpg gravity_default.jpg
  magick composite label:Center    -gravity center    rings.jpg gravity_center.jpg
  magick composite label:South     -gravity south     rings.jpg gravity_south.jpg
  magick composite label:East      -gravity east      rings.jpg gravity_east.jpg
  magick composite label:NorthEast -gravity northeast rings.jpg gravity_northeast.jpg

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

Observe que a posição real da imagem também é justificada de acordo com a configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Ou seja, um gravity de "South" centraliza a imagem na parte inferior da imagem maior, porém acima desse ponto de gravity. Isso se tornará mais importante adiante, com a rotação de texto. Outra coisa a lembrar é que a posição especificada por qualquer configuração "[-geometry](https://imagemagick.org/command-line-options/#geometry)" é relativa à posição em que o gravity coloca a imagem. Não só isso: a direção da posição também é modificada, de modo que a direção do posicionamento seja para dentro. Por exemplo, "-gravity South -geometry +10+10" moverá a imagem de rótulo mais para dentro do fundo. Ou seja, a direção Y da posição geométrica foi invertida, enquanto a direção X foi mantida.

  magick composite label:Default   -geometry +10+10 \
            rings.jpg gravity_default_pos.jpg
  magick composite label:South     -geometry +10+10 -gravity south \
            rings.jpg gravity_south_pos.jpg
  magick composite label:NorthEast -geometry +10+10 -gravity northeast \
            rings.jpg gravity_northeast_pos.jpg

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

Também é possível usar "[-gravity](https://imagemagick.org/command-line-options/#gravity)" com "-draw image" para colocar várias imagens com um único comando. |

  magick rings.jpg \
          -gravity Center     -draw "image Over     0,0 0,0 'castle.gif'" \
          -gravity NorthEast  -draw "image Bumpmap  0,0 0,0 'castle.gif'" \
          -gravity SouthWest  -draw "image Multiply 0,0 0,0 'castle.gif'" \
          gravity_image.jpg

[IM Output]
E agora também é possível usar "[-composite](https://imagemagick.org/command-line-options/#composite)" para sobrepor imagens ao fundo... |

  magick rings.jpg \
          -gravity Center     castle.gif  -compose Over     -composite \
          -gravity NorthWest  castle.gif  -compose Bumpmap  -composite \
          -gravity SouthEast  castle.gif  -compose Multiply -composite \
          gravity_image2.jpg

[IM Output]
Para mais detalhes sobre as configurações "[-compose](https://imagemagick.org/command-line-options/#compose)" usadas acima, consulte Composição Alfa. Para outros métodos de combinar e sobrepor várias imagens em uma única imagem, consulte a seção dos Exemplos do IM Camadas de Múltiplas Imagens.

Posicionamento de texto usando Gravity

Isso é ótimo para imagens, mas e quanto a desenhar texto diretamente sobre imagens? Pois bem, aplicam-se os mesmos efeitos básicos que valem para imagens. Como mencionado acima, o gravity também afeta o posicionamento do texto, seja usando o método 'text' de "[-draw](https://imagemagick.org/command-line-options/#draw)", seja usando o melhor operador de desenho de texto "[-annotate](https://imagemagick.org/command-line-options/#annotate)". |

  magick rings.jpg -resize 120x120  \
          -gravity northwest  -annotate 0 'NorthWest' \
          -gravity east       -annotate 0 'East' \
          -gravity center     -annotate 0 'Center' \
          -gravity south      -annotate 0 'South' \
          -gravity northeast  -annotate 0 'NorthEast' \
          gravity_text.jpg

[IM Output]
Há uma diferença muito importante entre posicionar imagens e texto. Se você desenhar um texto sem definir nenhuma forma de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", o texto será desenhado em relação à 'linha de base' (baseline) da fonte. Por exemplo, façamos isso na prática... |

  magick rings.jpg -annotate 0 'String' gravity_text_none.jpg

[IM Output]
Olhando com atenção, vê-se que apenas a pequena cauda em laço do 'g' de 'String' ficou visível na borda superior da imagem resultante. O restante do texto foi desenhado fora da imagem de fundo. No entanto, se "[-gravity](https://imagemagick.org/command-line-options/#gravity)" for definido como 'NorthWest', o texto será posicionado como se fosse uma imagem. Ou seja, em relação à sua caixa delimitadora ou caixa undercolor conforme definida pela fonte. Por exemplo... |

  magick rings.jpg -gravity NorthWest -annotate 0 'String'  gravity_text_nw.jpg

[IM Output]
A razão dessa distinção é garantir que o desenho de texto do IM permaneça compatível com outros formatos de imagem de desenho vetorial, como o "SVG". Esses formatos não usam gravity, portanto ativar o gravity instrui o IM a seguir, no desenho de texto, as mesmas regras do posicionamento de imagens, em vez das regras de gráficos vetoriais, que envolvem a 'linha de base' da fonte e o ponto de 'início' do texto. Se você ativar o gravity e depois quiser desativá-lo, pode usar "[-gravity](https://imagemagick.org/command-line-options/#gravity) none" ou "[+gravity](https://imagemagick.org/command-line-options/#gravity)" para redefini-lo à configuração padrão 'sem gravity'. Vamos aplicar um deslocamento de texto e desenhar tanto o argumento padrão 'None' quanto 'NorthWest' de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", apenas para mostrar quão próximas as duas formas são. |

  magick rings.jpg \
          -gravity NorthWest -annotate +10+20 'NorthWest' \
          -gravity None      -annotate +10+20 'None' \
          gravity_text_pos.jpg

[IM Output]
Embora não pareça neste exemplo, esses dois textos podem se sobrepor, particularmente no que diz respeito às descendentes de letras como 'g' e 'p'. Ou seja, os dois textos não são adequadamente separados por unidades de 'pointsize', mas apenas pela altura da linha de base da fonte. A melhor abordagem é não misturar os dois modos no seu próprio processamento de imagens. Use gravity ou não use. A escolha é sua. Texto na borda esquerda usando GravityComo exemplo final, eis a maneira de anotar de fato de forma centralizada ao longo da borda esquerda de uma imagem. O problema aqui é que, quando o texto é rotacionado, ele gira em torno do 'controlador' (handle) do texto. Infelizmente, esse controlador é definido pelo gravity ANTES de o texto ser rotacionado e, por isso, não funciona muito bem, a menos que se restrinja a 'texto centralizado'. [IM Output] Por exemplo, eis uma típica 'primeira tentativa' de posicionar o texto de modo que fique ao longo do centro da borda esquerda da imagem. É claro que falha de modo bastante inesperado! |

  magick rings.jpg \
          -gravity West -annotate 90x90+10+0 'String' \
          gravity_text_left_fail.jpg

Como se pode ver, o texto foi posicionado na borda esquerda, mas apenas de modo que o início (onde está o 'controlador' pré-rotação) fique centralizado. A causa desse problema é que, no IMv7, a configuração "-gravity" também é usada diretamente para definir a 'justificação' do texto (que define o 'controlador' usado para posicioná-lo). Existem algumas demonstrações animadas dos efeitos do gravity sobre texto rotacionado, escritas na API PerlMagick (baixe "[**im_annotation.pl**](../static/img/scripts/im_annotation.pl)"). Também foi criada uma versão em shell script do mesmo programa, "[**im_annotation**](../static/img/scripts/im_annotation)", e "[**im_annotation_2**](../static/img/scripts/im_annotation_2)". Um truque para fazer isso funcionar é rotacionar a imagem inteira primeiro e depois usar center south! É uma solução sem sentido, mas funciona. |

  magick rings.jpg -rotate -90 \
          -gravity South -annotate +0+2 'String' \
          -rotate 90  gravity_text_left.jpg

[IM Output]
Um método alternativo é mostrado abaixo em Posicionamento de texto usando Distort.

Posicionamento de texto usando Draw

Embora acima tenha-se usado um 'deslocamento de texto' para posicionar o texto em relação ao ponto "[-gravity](https://imagemagick.org/command-line-options/#gravity)", essa não é a única maneira de fazê-lo. O outro método é usar a opção "-draw translate" para posicionar o texto. Isso tem a vantagem de permitir posicionar o texto sem efeitos de gravity, ao mesmo tempo em que se usa o gravity para 'justificar' o 'controlador' de posicionamento dentro do texto. Nestes exemplos foram adicionadas algumas linhas de construção extras (que também não são afetadas pelo gravity) para mostrar como a posição é aplicada a partir do ponto central da imagem. Texto com um deslocamento... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan  -draw 'line 50,50 70,70' \
          -fill red   -draw 'line 68,70 72,70 line 70,68 70,72' \
          -fill blue  -draw "text 20,20 'Offset'" \
          text_offset.jpg

[IM Output]
Texto com uma translação... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 text 0,0 'Translate'" \
          text_translate.jpg

[IM Output]
Como se pode ver, ambos produzem o mesmo resultado efetivo. Mas, como o "-draw text" exige que se forneça um deslocamento como parte de seus argumentos, ele é usado mais comumente para posicionar o texto desenhado a partir da linha de comando. No entanto, embora esses dois métodos produzam o mesmo resultado, eles produzirão resultados completamente diferentes quando a rotação do texto também for aplicada. Isso se deve, basicamente, à ordem em que as ações são aplicadas.

Desenhar texto rotacionado

Há duas formas distintas de posicionar texto desenhado: usar um 'deslocamento de texto' ou 'transladar' o texto até a posição final. Os efeitos desses dois métodos de posicionamento produzem resultados muito diferentes quando a rotação também é aplicada. A razão disso é complexa, mas envolve essencialmente como o IM realiza as Deformações da Superfície de Desenho. Dito isso, vejamos o que acontece ao rotacionar um texto usando as duas posições diferentes. Apenas um deslocamento, sem rotação... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "text 20,20 'None'" \
          rotate_none.jpg

[IM Output]
Rotacionando texto com um deslocamento... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 50,78' \
          -fill red  -draw 'line 48,78 52,78  line 50,76 50,80' \
          -fill blue -draw "rotate 45 text 20,20 'Offset'" \
          rotate_offset.jpg

[IM Output]
Rotacionando texto com translação... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 rotate 45 text 0,0 'Translate'" \
          rotate_translate.jpg

[IM Output]
Isso é, na verdade, o que a maioria das pessoas deseja. Embora a rotação por deslocamento possa ser útil para alguns efeitos especiais. Observe como a ordem dessas Deformações da Superfície de Desenho é inversa à ordem em que são dadas. A rotação é executada primeiro e a translação, em segundo lugar. Se você inverter os métodos 'rotate' e 'translate', obterá o mesmo resultado de um 'deslocamento de texto' comum, ou seja, um deslocamento rotacionado. O operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" foi projetado especificamente para facilitar o posicionamento de texto rotacionado, pedindo explicitamente ao IM que desenhe o texto com rotação, em vez de 'realizar a deformação da superfície'. Annotate com rotação e deslocamento... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -annotate 45x45+20+20 'Annotate' \
          rotate_annotate.jpg

[IM Output]
O problema dos exemplos acima é que a configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)" do IMv7 não se refere apenas à posição na imagem de fundo, mas também à posição na imagem de sobreposição que será desenhada. O IMv7 adicionará a 'Justificação de Texto', que se refere à posição da sobreposição, como uma configuração separada (mas relacionada) do gravity (posição no fundo).

Posicionamento de texto usando Distort

Usar a Distorção SRT com Camadas de Imagens é um método particularmente bom para posicionar imagens (ou texto em imagens). Basicamente, ele permite um controle completo de baixo nível tanto sobre o ponto em que a imagem é posicionada quanto sobre como a imagem deve ser disposta em relação a esse ponto. Para começar, cria-se aqui uma 'imagem de texto' com fundo transparente e simplesmente coloca-se a imagem em camada sobre a imagem de fundo. |

  magick rings.jpg -background none label:'Some Text' \
          -flatten  layer_simple.jpg

[IM Output]
Como se pode ver, o texto foi simplesmente adicionado à imagem no canto superior esquerdo. Vamos rotacioná-lo usando distort (variante layers) -- Observe o uso dos parênteses para limitar qual imagem é distorcida! |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT 70 \
          \) -flatten  layer_rotate.jpg

[IM Output]
Observe que a posição do texto NÃO foi alterada! Tudo o que aconteceu foi que o distort rotacionou o texto em torno do ponto central (o controlador), mas de modo que, em relação ao 'canvas virtual', esse ponto não se moveu. Assim, quando a imagem agora maior é Achatada, seu ponto de rotação 'o centro da imagem de texto' não se moveu. O próximo passo é mover esse controlador, mas para isso é preciso usar quase todo o conjunto de argumentos da Distorção SRT. Como se quer continuar usando também o 'controlador central', é preciso usar alguns Escapes Percentuais de Propriedade de Imagem, ou mais especificamente Escapes Percentuais FX. Então, vamos colocar o centro em '+60+60' na imagem de fundo |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%[fx:h/2] 1 70 60,60' \
          \) -flatten  layer_translate.jpg

[IM Output]
Outra maneira de mover uma 'imagem em camada' é usar o Operador Repage. Especialmente um movimento relativo usando uma flag '!'. O 'controlador' para isso é, pela natureza das imagens em camada, o canto superior esquerdo. O Operador de Distorção SRT não só transladará a imagem usando o controlador especificado, como também pode usar posições sub-pixel (de ponto flutuante) para ambos os controladores. Ou seja, ele pode distorcer o texto em incrementos sub-pixel para qualquer local, sem as restrições de números inteiros que a maioria das outras operações tem. O exemplo final é posicionar o texto rotacionado em 90 graus na borda esquerda. O controlador do texto em torno do qual rotacionar e posicionar será, desta vez, o centro inferior do texto, antes de ser rotacionado. Ou seja, uma posição calculada de '%[fx:w/2],%h'. A posição na imagem de fundo também deve agora ser calculada para o centro da borda esquerda ('0,%[fx:h/2]'). O problema é que o Operador de Distorção SRT não tem acesso à imagem de fundo enquanto distorce a imagem de texto. A solução é fazer esse cálculo de posição quando a imagem de fundo estiver disponível e salvá-lo em alguma 'configuração pessoal', que pode então ser adicionada aos argumentos do distort. Essa técnica é examinada mais de perto em Extrair Informações de Outras Imagens. Eis então o resultado. Primeiro, calcula-se a posição na imagem de fundo. Depois, distorce-se a imagem de texto para que seu 'controlador' também seja movido até essa posição pré-calculada. |

  magick rings.jpg -set option:my:left_edge '0,%[fx:h/2]' \
          \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%h 1 90 %[my:left_edge]' \
          \) -flatten  layer_on_left.jpg

[IM Output]
A string 'my:' pode ser qualquer coisa que não entre em conflito com prefixos existentes. Ou seja, ela é usada para guardar as MINHAS (MY) configurações, separadas de quaisquer outras configurações que o ImageMagick possa usar para codificadores ou opções específicas. Prefixar com 'my:' é uma boa escolha para isso. Os escapes percentuais são tratados puramente como substituições de string e, de fato, seria possível gerar toda a opção Distort como uma string. O único problema é que não se pode fazer cálculos matemáticos sobre as configurações 'my:' depois que elas foram definidas. Por isso, qualquer cálculo matemático deve ser feito de antemão. Isso é algo que será considerado para o IMv7, de modo que as expressões FX usem variáveis de escape %.