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

Exemplos do ImageMagick -- Manipulação de Texto

Criar rótulos de texto, ou adicionar texto a imagens, é provavelmente uma das operações mais básicas e comuns para as quais o ImageMagick é utilizado. É também uma das mais simples, mas com margem para resultados bastante sofisticados. Por isso, este é um bom ponto de partida para a nossa exploração das capacidades do IM.


Operadores de Texto no ImageMagick

O ImageMagick tem muitas maneiras diferentes de desenhar texto dentro de uma imagem, destacando a versatilidade da biblioteca de processamento de imagens. Esta página detalha métodos e estilos específicos de desenho de texto. O que você deve ter em mente ao estudar estes exemplos é que o ImageMagick é, antes de mais nada, um conversor e modificador de imagens. Por isso, cada um dos métodos fornecidos são operadores simples de desenho de texto, como adicionar rótulos e mensagens de copyright às imagens. Veja Anotando Imagens. Todos os operadores de texto também compreendem e usam um conjunto de configurações padrão de processamento de texto, como a "[-font](https://imagemagick.org/command-line-options/#font)" e o "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" a usar. Também a configuração de cor "[-fill](https://imagemagick.org/command-line-options/#fill)" e, para desenho de texto mais complexo, as cores "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)", "[-stroke](https://imagemagick.org/command-line-options/#stroke)" e "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". Nos casos em que você realmente cria uma nova imagem, como rótulos e legendas, a configuração de cor "[-background](https://imagemagick.org/command-line-options/#background)" também é usada. E, finalmente, os modificadores mais recentes "[-kerning](https://imagemagick.org/command-line-options/#kerning)" e "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)". O que o ImageMagick não é, é um processador completo de texto formatado e de documentos. Se você quer processamento intensivo de texto, é melhor usar um processador de texto interativo completo, ou um formatador de texto em lote como o "TeX" (ou uma de suas variantes (veja Um Sistema Completo de Processamento de Texto abaixo). A saída desses programas (geralmente em formato postscript) pode então ser convertida em uma imagem e posteriormente modificada pelo ImageMagick. Ou seja, use a ferramenta certa para o trabalho certo. Dito isso, alguma manipulação de fontes mistas pode ser feita. Como ponto de partida, veja Criando Linhas com Estilos de Fonte Misturados, perto do final desta página. Agora, vejamos as formas básicas de transformar texto em imagens com a magia do IM. Mais adiante, na próxima seção (Fontes Compostas) veremos a geração de alguns efeitos de fonte interessantes.


Label - Rótulo de Texto Simples

Rótulos Básicos

Criar uma imagem de fonte usando uma imagem "label:" é a forma mais típica de desenhar uma fonte rapidamente no ImageMagick. A maior vantagem é que ela gera sua própria tela de acordo com as configurações de cor "[-background](https://imagemagick.org/command-line-options/#background)" e "[-fill](https://imagemagick.org/command-line-options/#fill)" atuais, sendo dimensionada para corresponder ao texto desenhado. Por exemplo, aqui está um rótulo típico gerado.

  magick -background lightblue -fill blue \
          -font Candice -pointsize 72 label:Anthony \
          label.gif

[IM Output]

O exemplo acima é provavelmente o uso mais típico do rótulo (label), com uma seleção de fonte e um "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" definindo os resultados. Mas é de longe a forma menos interessante de gerar rótulos de texto. A imagem 'label:' gerada também terá os metadados da Propriedade de Imagem 'label' definidos com a mesma string. Alguns formatos de arquivo, como MIFF e PNG, salvarão essa propriedade específica e ela pode ser usada em programas posteriores de processamento de imagem. Para um exemplo de uso dos metadados 'label', veja Montagem usando Metadados Salvos.
Se você também especificar um "[-size](https://imagemagick.org/command-line-options/#size)", então a imagem de rótulo gerada será criada com esse tamanho.
  magick -background lightblue -fill blue  -font Candice \
          -size 165x70 -pointsize 24 label:Anthony     label_size.gif

[IM Output]
Você também pode usar "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para definir a posição do rótulo dentro dessa caixa maior. |

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70  -pointsize 24  -gravity center \
          label:Anthony     label_gravity.gif

[IM Output]
Claro que, se você não definir um "[-size](https://imagemagick.org/command-line-options/#size)" para o rótulo, nenhum espaço extra estará disponível no "label:" gerado para a "[-gravity](https://imagemagick.org/command-line-options/#gravity)" usar, tornando-a bastante inútil. O problema de usar AMBOS "[-size](https://imagemagick.org/command-line-options/#size)" e "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" juntos é que o texto pode 'transbordar' o tamanho de imagem especificado. |

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70  -pointsize 72  -gravity center \
          label:Anthony     label_overflow.gif

[IM Output]
| Antes da versão 6.5.2-4, o IM ignorava completamente a configuração "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" se uma configuração "[-size](https://imagemagick.org/command-line-options/#size)" também fosse fornecida. Isso faz com que o texto nas imagens acima seja dimensionado automaticamente de acordo com a manipulação de 'melhor ajuste' (veja o próximo conjunto de exemplos).
---|---

Melhor Ajuste à Imagem

O maior truque para usar rótulos a fim de gerar imagens de um "[-size](https://imagemagick.org/command-line-options/#size)" específico é NÃO especificar um "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" para o rótulo. Quando isso acontece, o IM terá a liberdade de tentar selecionar um tamanho de fonte que melhor se ajuste ao tamanho de imagem solicitado. Ou seja, o texto desenhado será ajustado para caber no tamanho indicado! |

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70  label:Anthony     label_size_fit.gif

[IM Output]
Como você pode ver, ao definir uma configuração "[-size](https://imagemagick.org/command-line-options/#size)", você pode acabar com algum espaço extra à direita ou abaixo da imagem. | Quando o IM cria um rótulo de 'melhor ajuste' (bestfit), o pointsize realmente usado também é salvo na Propriedade de Imagem 'label:pointsize', permitindo que você use essa informação posteriormente. Isso foi adicionado ao IM v6.6.2-7, durante a discussão no fórum Relato do Pointsize
---|---
Você ainda pode ajustar a posição do rótulo nesse espaço extra ajustando a configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)". |

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70 -gravity center label:Anthony     label_size_gravity.gif

[IM Output]
Claro que, se você não definir um "[-size](https://imagemagick.org/command-line-options/#size)" para o rótulo, nenhum espaço extra estará disponível no "label:" gerado para a "[-gravity](https://imagemagick.org/command-line-options/#gravity)" usar, então só faz sentido quando você pede que a imagem tenha um tamanho específico. Agora, a melhor notícia. Se a configuração "[-size](https://imagemagick.org/command-line-options/#size)" que você fornecer contiver apenas a largura ou a altura do rótulo, a fonte será ajustada para melhor se ajustar a essa dimensão dada. A outra dimensão não especificada será então ajustada automaticamente para caber esse texto! |

  magick -background lightblue -fill blue -font Candice \
          -size 160x  label:Anthony     label_size_width.gif

[IM Output]
Basicamente, isso significa que o "label:" acima sempre terá 160 pixels de largura, com o maior tamanho de fonte para essa largura. A altura do rótulo será então ajustada de forma adequada. A mesma coisa será feita se a altura for especificada, mas não a largura. |

  magick -background lightblue -fill blue -font Candice \
          -size x40  label:Anthony     label_size_height.gif

[IM Output]
Este rótulo tem 40 pixels de altura, o pointsize não definido do texto foi ajustado para caber nessa altura, e então a largura não definida foi configurada para caber o texto desenhado. Exatamente como você esperaria. Claro que, neste caso, haverá novamente pouco ou nenhum espaço extra para qualquer configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)" usar.

Rótulos em Múltiplas Linhas

O gerador "label:" pode (a partir da versão 6.2.5 do IM) gerar rótulos de múltiplas linhas. |

  magick -background lightblue  -fill blue  -font Ravie -pointsize 20 \
          label:'ImageMagick\nRules - OK!'     label_multiline.gif

[IM Output]
Como você pode ver, "label:" compreende o uso de '\n' como representando quebras de linha. Isso significa que você pode ter que pré-processar seu texto de entrada para garantir que quaisquer caracteres especiais sejam escapados ao colocar os dados na linha de comando. Veja Caracteres de Escape Especiais em Argumentos de Texto abaixo para mais detalhes. Como "[-gravity](https://imagemagick.org/command-line-options/#gravity)" também afeta a geração de "label:" (a partir da versão 6.2.6 do IM), você pode usá-la para 'justificar' rótulos de múltiplas linhas. |

  magick -background lightblue -fill blue -font Corsiva -pointsize 24 \
          -gravity center    label:'ImageMagick\nExamples\nby Anthony' \
          label_centered.gif

[IM Output]
Um recurso importante do IM é que ele pode ler os dados de texto a usar a partir de um arquivo. Isso é feito prefixando o nome do arquivo com um caractere 'arroba' '@', e usando isso como argumento de string. Por exemplo, aqui criamos um rótulo a partir do arquivo 'mensagem do dia' da minha estação de trabalho...

  magick -background lightblue  -fill blue \
          label:@/etc/motd   label_file.gif

[IM Output]

Você também pode ler o texto de um rótulo a partir do pipeline de entrada padrão. Por exemplo, aqui transformo, com a magia do IM, a saída de um gerador de citações em um rótulo de múltiplas linhas.

  mesgs ImageResolution |\
    magick -background lightblue  -fill blue \
            label:@-   label_file_multiline.gif

[IM Output]

Observe que o nome de arquivo que usei foi apenas um caractere '-'. Isso significa que o arquivo deve ser lido a partir da entrada padrão. Lembre-se de que você pode usar o '@_nomedearquivo_' para ler QUALQUER argumento de string da linha de comando no IM. Isso inclui todos os outros métodos de entrada de texto apresentados abaixo. No entanto, ele só pode ser usado para substituir o argumento de string inteiro, não uma parte de um argumento de string. Observe também que, nos exemplos acima, uma linha em branco extra foi adicionada à imagem do rótulo. Essa linha em branco é causada por uma quebra de linha final no arquivo de texto de entrada. A menos que você de alguma forma remova a quebra de linha final do arquivo de entrada (veja o exemplo de caption: abaixo para um método de corrigir isso), "label:" sempre terá essa linha em branco dos arquivos de texto de entrada. A maioria das versões mais antigas do IM (antes da v6.2.5) não manipula rótulos de múltiplas linhas. Nessas versões, as linhas teriam sido anexadas juntas para formar uma única linha, muito muito longa.

Rótulos Verticais

Claro que você também pode adicionar quebras de linha ao texto de entrada. Por exemplo, aqui pego uma palavra simples e adiciono uma quebra de linha entre cada uma das letras, para criar um texto vertical centralizado. |

  echo -n "Vertical" | sed 's/./&@/g; s/@$//' | tr '@' '\012' |\
    magick -background lightblue -fill blue -font Ravie -pointsize 24 \
            -gravity center    label:@-   label_vertical.gif

Observe que o comando "sed" adiciona um caractere '@' após cada caractere, exceto no final da string. O "tr" então substitui os caracteres '@' por quebras de linha. Ele também assume que o texto de entrada não termina com uma quebra de linha, o que causaria a adição de um espaço em branco extra na parte inferior da imagem resultante. [IM Output]
Usuários que utilizam linux, e portanto usam a versão GNU do comando "sed", podem remover o "tr", e substituir o '@' por '\n' no comando sed, de modo que ele insira diretamente as quebras de linha entre cada caractere. Veja também o atributo especial Espaçamento Entre Linhas que pode ser usado para ajustar o espaço entre os caracteres.


Caption - Rótulo com Quebra de Linha por Palavras

A imagem "caption:" gerada a partir de entrada de texto é, na maioria dos aspectos, exatamente como "[label:](#label)", exceto que, em vez de expandir o tamanho do texto para caber em uma configuração "[-size](https://imagemagick.org/command-line-options/#size)" especificada, ela quebra por palavras quaisquer linhas longas que não caibam na largura "[-size](https://imagemagick.org/command-line-options/#size)" especificada. A configuração "[-size](https://imagemagick.org/command-line-options/#size)" não é opcional, porém, e deve ao menos especificar uma largura máxima em pixels. Por exemplo, aqui está uma legenda de uma linha longa que não caberá na largura especificada.

  magick -background lightblue  -fill blue  -font Corsiva -pointsize 36 \
          -size 320x   caption:'This is a very long caption line.' \
          caption.gif

[IM Output]

| A imagem 'caption:' gerada também terá os metadados da Propriedade de Imagem "caption" 'definidos' com a mesma string, permitindo que você reutilize essa informação posteriormente. Todos os formatos de arquivo de imagem comuns salvarão essa informação com a imagem. Veja Montagem usando Metadados Salvos para exemplos.
---|---
Por padrão, o texto é todo justificado à esquerda; entretanto, a partir da versão 6.2.0 do IM, "caption:" respeita "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para fins de justificação do texto.

  magick -background lightblue  -fill blue  -font Candice -pointsize 40 \
          -size 320x  -gravity Center  caption:'ImageMagick Rules OK!' \
          caption_centered.gif

[IM Output]

Se você fornecer uma altura além de uma largura na configuração "[-size](https://imagemagick.org/command-line-options/#size)", então a altura da imagem também será definida com essa altura. Você pode então usar também a configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para posicionar o texto verticalmente.

  magick -background lightblue  -fill blue  -font Gecko -pointsize 32 \
          -size 320x100  -gravity South caption:'Captions at their height!' \
          caption_height.gif

[IM Output]

Observe, porém, que se o texto não couber (em termos de altura) no "[-size](https://imagemagick.org/command-line-options/#size)" que você especificou com o "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" dado, então o texto transbordará a caixa. A configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)" atual determinará naturalmente qual parte do texto será cortada. Por exemplo, este é exatamente o mesmo do exemplo anterior, mas com um "[-size](https://imagemagick.org/command-line-options/#size)" de imagem pequeno demais para o resultado.

  magick -background lightblue  -fill blue  -font Gecko -pointsize 32 \
          -size 320x60  -gravity South caption:'Captions at their height!' \
          caption_height_toosmall.gif

[IM Output]

Legenda de Melhor Ajuste

A partir do IM v6.3.2, se você fornecer tanto a largura quanto a altura da imagem final, mas não definir o "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" da fonte (ou desativar o pointsize com "[+pointsize](https://imagemagick.org/command-line-options/#pointsize)"), o IM tentará ajustar automaticamente o tamanho da fonte de modo a preencher da melhor forma o "[-size](https://imagemagick.org/command-line-options/#size)" da imagem que você solicitou. Por exemplo, aqui peço ao ImageMagick para preencher uma área bastante grande...

  magick -background lightblue -fill blue -font Candice -size 320x140 \
          caption:'This text is resized to best fill the space given.' \
          caption_filled.gif

[IM Output]

E agora uma área muito menor e mais estreita, para a mesma fonte e string de texto. |

  magick -background lightblue -fill blue -font Candice -size 80x110 \
          caption:'This text is resized to best fill the space given.' \
          caption_filled_sm.gif

[IM Output]
Observe que a ÚNICA diferença entre os dois últimos exemplos é o "[-size](https://imagemagick.org/command-line-options/#size)" da imagem gerada. O IM ajustou o texto e a quebra de linha por palavras de modo a tentar preencher da melhor forma o tamanho de imagem especificado. Isso é extremamente útil para ajustar um trecho de texto desconhecido em um determinado espaço, sem que ele transborde os limites da área. Entretanto, internamente é equivalente a executar caption várias vezes, à medida que o IM procura o pointsize correto a usar para preencher da melhor forma o espaço dado. Em outras palavras, muitas vezes pode ser 10 vezes ou mais lento do que se você tivesse fornecido um "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" específico a usar.

Legendas com Parágrafos

O operador de imagem "caption:" (a partir do IM v6.2.5) compreende o uso do escape de shell '\n' (e, portanto, você precisa duplicar a barra invertida '\\' para escapar barras invertidas), como significando uma nova linha ou parágrafo. Antes desta versão, parágrafos separados teriam que ser processados por operações "caption:" separadas.

  magick -background lightblue -fill blue \
          -font Ravie -pointsize 24 -size 360x \
          caption:"Here I use caption to wordwrap.\nTwo separate lines." \
          caption_multi_line.gif

[IM Output]

Você pode ler o texto a ser desenhado a partir de um arquivo, ou da entrada padrão (de um comando anterior em pipeline), usando o prefixo de nome de arquivo '@', assim como podemos fazer com "[label:](#label)".

  mesgs FilePrivate |\
    magick -background  lightblue  -fill blue  -pointsize 12 \
            -size 320x  caption:@-  caption_file.gif

[IM Output]

Como você pode ver, as quebras de linha no texto de entrada serão (a partir do IM v6.2.5) tratadas como separadores de parágrafo. Isso inclui quaisquer quebras de linha finais no arquivo de entrada. Claro que "[label:](#label)" não quebrará as linhas por palavras, mas as preservará. Se você realmente quiser que um arquivo seja tratado como um único parágrafo, então você precisará substituir os caracteres de quebra de linha por um caractere de espaço, de modo que todo o seu texto fique em uma única linha. Por exemplo, aqui pegamos o mesmo texto, mas substituímos as quebras de linha por espaços, e então substituímos quaisquer múltiplos espaços entre as palavras por um único espaço...

  mesgs FilePrivate |      tr '\012' ' ' | sed 's/  */ /g' |\
    magick -background  lightblue  -fill blue  -pointsize 12 \
            -size 320x  caption:@-  caption_one_line.gif

[IM Output]

Como você pode ver, isso funciona muito melhor. No entanto, muitas vezes o que você quer é tratar uma linha em branco como uma quebra de parágrafo. Isso significa que você precisa remover todas as quebras de linha, exceto aquelas envolvidas com linhas em branco. Aqui está um comando "sed" especial para transformar tal texto, com a magia do IM, no formato necessário para "caption:". Neste caso, o texto é a primeira página da página de manual do "magick".

  man magick | col -b | expand | \
    sed '/^$/d; :loop y/\n/ /; N; /\n$/! b loop;  s/   */ /g; s/^ //' |\
      head -n 7 |    magick -size 400x  caption:@-  caption_manual.gif

[IM Output]

| Não há opção de texto 'justificado' para caption. Mas o formatador de texto pango: (usando uma biblioteca externa) possui esse recurso, e muito mais.
---|---


Atributos de Texto

Originalmente, as configurações que afetam a manipulação de texto incluíam: "[-font](https://imagemagick.org/command-line-options/#font)", "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", "[-size](https://imagemagick.org/command-line-options/#size)" e "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Já apresentamos muitos desses controles de atributos acima. Mas existem outros controles de atributos que não são usados com tanta frequência, e que originalmente não afetavam a geração de imagem de texto "label:" ou "caption:". A partir do IM v6.3.2, você também pode usar "[-stroke](https://imagemagick.org/command-line-options/#stroke)", "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" e "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". "label:" ou "caption:". Por exemplo, aqui faço uso de muitas configurações diferentes para controlar os atributos da renderização da imagem de texto do IM... |

   magick -background white -fill dodgerblue  -font Candice \
           -strokewidth 2  -stroke blue   -undercolor lightblue \
           -size 165x70 -gravity center label:Anthony     label_color.gif

[IM Output]
Para mais detalhes sobre essas configurações, veja Caixa de Undercolor abaixo, e Stroke, StrokeWidth na seção de desenho. | No momento, você não pode usar imagens de ladrilho (tiling) definidas usando "[-tile](https://imagemagick.org/command-line-options/#tile)", "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-background](https://imagemagick.org/command-line-options/#background)" e "[-origin](https://imagemagick.org/command-line-options/#origin)", com "label:" ou "caption:". Apenas cores sólidas podem ser usadas. Tentar fazê-lo apenas produzirá uma cor indefinida (preta).
---|---

Pointsize, Densidade e o Tamanho Real da Fonte

Pixels são pontos no monitor ou em uma imagem, e é com isso que o IM trabalha. Por outro lado, as imagens são impressas em uma resolução específica (especificada como 'pontos por polegada' (dpi) ou pixels por polegada (ppi)). Por isso, a resolução de uma imagem afeta como outros programas dimensionarão uma imagem em uma mídia específica. EX: ela afeta o tamanho físico da imagem no mundo real. A resolução (densidade ou dpi) de uma imagem é irrelevante para o tamanho em pixels de uma imagem, e para a quantidade de espaço que uma imagem ocupa na memória ou no disco. Ela também é, em geral, irrelevante para a maioria das operações de imagem do IM. Por isso, para o ImageMagick, a resolução é apenas um conjunto de números armazenados com a imagem, e normalmente é ignorada. A única vez em que a resolução ou densidade de uma imagem se torna relevante é para fontes e para converter formatos vetoriais como postscript, pdf, MWF, para os formatos de imagem raster que o IM manipula. A configuração "[-density](https://imagemagick.org/command-line-options/#density)" informa ao IM quantos pixels (pontos) por polegada (ppi) estão presentes no dispositivo de saída, que ele pode então usar para ajustar a geração da imagem e os tamanhos de fonte de modo a corresponder. Por exemplo, por padrão o IM trabalha com uma configuração "[-density](https://imagemagick.org/command-line-options/#density)" de 72 ppi, que é uma configuração típica para exibir imagens em um monitor ou página web. Como o tamanho de uma fonte é especificado em 'pontos' (usando "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" e, por definição, 1 ponto é 1/72 de polegada, então uma fonte de 72 pontos deve produzir um texto dimensionado para ter aproximadamente 1 polegada de altura... |

  magick -pointsize 72 label:Hello  pointsize.gif

[IM Output]
No entanto, a maioria dos monitores modernos tem uma resolução melhor do que isso, tipicamente entre 90 e 120 pixels por polegada (ppi). Por isso... |

  magick -density 90 -pointsize 72 label:Hello  density.gif

[IM Output]
Deveria produzir um rótulo com 1 polegada de altura em um monitor de 90 dpi. E no meu monitor produz! Você pode medir a altura dessas imagens na sua tela, para verificar a resolução do seu monitor. Como o número de pixels por polegada é maior, a fonte desenhada também é naturalmente maior em termos do número de pixels na imagem, produzindo assim uma imagem maior. Programas de imagem diferentes frequentemente têm uma densidade padrão diferente, e isso pode fazer com que as fontes apareçam de forma diferente quando desenhadas por programas diferentes, mesmo no mesmo tamanho de ponto. Observe que "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" na verdade significa a separação entre linhas de uma fonte (na verdade, a altura de sua área de desenho), e NÃO se refere à altura real das letras desenhadas! Por isso, uma fonte pode parecer maior ou menor do que outra fonte, com o mesmo pointsize e densidade. Apenas o espaçamento entre linhas das fontes será realmente o mesmo; qualquer outra coisa depende da fonte e de seu designer. Por isso, com uma "[-density](https://imagemagick.org/command-line-options/#density)" padrão de 72dpi (na qual 1 ponto = 1 pixel), uma fonte de 12 pontos deve ter 12 pixels de separação entre as linhas de base de duas linhas de texto. | Observe que a altura de uma imagem "[label:](#label)" gerada é baseada na área de desenho da imagem ou caixa delimitadora, que é, frequentemente, o espaçamento entre linhas e o pointsize da fonte. Nem sempre é assim; por isso, simplesmente anexar linhas de texto verticalmente é, na verdade, uma manipulação de fonte incorreta!
---|---
Algumas fontes podem até se estender bem além dos limites normais de separação entre linhas, estendendo-se bem acima ou, mais comumente, abaixo do espaçamento entre linhas. Isso é especialmente verdade para fontes de escrita à mão (hand script). A aparência de uma fonte também é afetada pelo "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" e pela "[-density](https://imagemagick.org/command-line-options/#density)" da fonte. Dobrar o pointsize de uma fonte ("-pointsize 24") também produzirá uma fonte que parece ter aproximadamente o mesmo tamanho de uma com o dobro da densidade ou resolução. No entanto, como uma fonte é projetada para parecer de uma maneira específica, a espessura das linhas em uma fonte pode não mudar muito com um tamanho de ponto maior. Ou seja, o tamanho de fonte maior é ligeiramente diferente. Mas se você apenas dobrar a densidade ("-density 144"), uma fonte de 12 pontos será desenhada com suas dimensões dobradas, e ainda deve parecer a fonte original de 12 pontos, apenas desenhada em uma escala maior, com melhor suavização das bordas. No entanto, em resoluções muito baixas, as limitações de tamanho físico dos pixels também podem afetar a aparência de uma fonte. Isso significa que linhas finas podem ficar mais grossas em densidades mais baixas, devido ao grande tamanho de pixel que a densidade está definindo. A relação entre 'densidade' e 'pointsize' é uma questão muito complexa, e que apenas um designer gráfico de fontes profissional pode compreender totalmente, e projetar suas fontes para lidar corretamente. Segundo o Lithium dos Fóruns do IM...

Eu acho que é um recurso do renderizador de fontes TrueType. Um glifo TrueType não é apenas um conjunto de curvas; ele pode conter múltiplos níveis de detalhe e instruções que ajustam as coordenadas dos pontos de acordo com o tamanho de saída em pixels, o que é mais visível para tamanhos pequenos em pixels. Por causa disso, texto pequeno parece diferente (e mais nítido, é possível notar) do que texto grande reduzido.

EXEMPLO FUTURO: diferença entre fonte no mesmo tamanho em 'pixel', mas com densidade e tamanho de ponto diferentes. Basicamente, aumentar um desses fatores enquanto se diminui o outro na mesma proporção pode não produzir o mesmo resultado. Particularmente no que diz respeito à espessura das linhas e ao 'estilo' geral da fonte. É melhor você ajustar o fator certo para o que está fazendo. Use "[-density](https://imagemagick.org/command-line-options/#density)" ao dimensionar uma fonte para um dispositivo de saída, ou para um redimensionamento posterior da fonte, e use "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" para mudanças normais de tamanho de fonte. Se você gostaria de saber mais sobre fontes, então dê uma olhada no documento TrueType Fundamentals (PDF), que achei muito interessante.

Limites da Imagem de Rótulo

Ao usar algumas fontes exóticas, a fonte pode usar caracteres estendidos, e no passado o IM tinha muitos problemas para criar rótulos para essas fontes. Ou seja, o texto transborda a tela fornecida. Por exemplo, aqui estão duas letras maiúsculas em uma fonte 'LokiCola' que lembra um certo refrigerante famoso. |

  magick -background lightblue -fill blue -font LokiCola -pointsize 64 \
          label:HC  label_overflow_font.gif

[IM Output]
Como você pode ver, o IM consegue conter essa fonte em um rótulo sem cortar os elementos gráficos iniciais ou finais da fonte. | Antes do IM v6.3.2, "[label:](#label)" teria cortado o início do 'H' e partes das caudas de ambos os caracteres, no exemplo acima.
---|---
A razão pela qual esse problema existia é que os 'glifos' da fonte, ou a descrição dos caracteres, desenham fora dos limites definidos da fonte para letras específicas, permitindo que eles se sobreponham (geralmente acima ou abaixo) aos outros caracteres dentro da fonte. Este é um problema com a forma como a própria fonte é projetada e definida, e não foi culpa do IM, embora o IM agora lide com essas situações estranhas da melhor forma para os interesses dos usuários. Em outras situações, ainda pode ser um problema, e que não pode ser resolvido simplesmente devido às interações de texto em múltiplas linhas. Para mais informações, veja os exemplos de Transbordamento da Caixa Delimitadora abaixo, para uma descrição mais precisa.

Texto em Formato Unicode ou UTF8

Este método de fornecer argumentos de string ao IM é muito importante, pois permite que você faça coisas que normalmente seriam muito difíceis de fazer a partir da linha de comando. Especificamente, manipular 'texto unicode', ou selecionar caracteres específicos usando códigos de caractere. Agora, se você puder digitar caracteres unicode em comandos ou scripts, você pode usá-los diretamente..

  magick -background lightblue -fill blue -pointsize 32 \
          label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ '    label_i8n.gif

[IM Output]

No entanto, poucas pessoas têm teclados ou editores configurados corretamente para lidar com a entrada de caracteres unicode. Mesmo que você não consiga digitar caracteres unicode diretamente, uma solução simples é apenas 'copiar e colar' os caracteres desejados de algum arquivo de texto UTF-8 existente, ou página web. Eu faço isso! Se o texto UTF-8 que você deseja desenhar já foi gerado, você pode lê-lo diretamente de um arquivo usando '@nomedearquivo'. Por exemplo, aqui crio um rótulo em chinês a partir de um arquivo de texto em chinês codificado em UTF-8 (sem uma quebra de linha final no arquivo).

  magick -background lightblue -fill blue -pointsize 48 \
          -font ZenKaiUni label:@chinese_words.utf8   label_utf8.gif

[IM Output]

| _A fonte usada no exemplo acima é uma fonte especial, com o conjunto completo de Glifos Chineses definido, como as fontes do linux fedora 'SimSun' (ou no arquivo de fonte "gkai00mp.ttf"), "ZenKaiUni" (no arquivo "ukai.ttf") ou "ShanHeiSunUni" (em qualquer um dos arquivos "uming.ttf" ou "zysong.ttf" ou "bsmi00lp.ttf").

Observe que a fonte do windows 'Mincho' (usada em um exemplo posterior) também define muitos dos Glifos Chineses, mas de forma incompleta. Se você usá-la com o exemplo acima, obterá alguns pontos de interrogação para glifos indefinidos.

O script especial "[imagick_type_gen](../static/img/scripts/imagick_type_gen)" foi usado para encontrar, extrair o nome próprio das fontes, e adicionar a fonte a um arquivo de configuração "type.xml" do ImageMagick.

_
---|---
Também podemos gerar strings UTF-8 a partir de códigos de caractere unicode usando o programa 'GNU' "printf" (em sistemas linux) para transformar números unicode na string codificada em UTF-8 específica, neste caso aspas tipográficas de abertura e fechamento adequadas (novamente sem quebra de linha final na entrada UTF-8). Aqui, por exemplo, gero o texto UTF-8 usando códigos de caractere unicode, e o alimento usando um pipeline de comandos (lido da 'stdin' usando "@-"), em vez de a partir de um arquivo real.

  env LC_CTYPE=en_AU.utf8 \
    printf "‘single’ - “double”" | \
      magick -background lightblue -fill blue -pointsize 36 \
              label:@-  label_quotes.gif

[IM Output]

Em outros sistemas (como Mac OSX e Windows) você pode usar o "printf" do perl para gerar uma string de caracteres codificada em UTF-8 a partir de códigos de caractere unicode.

  perl -e 'binmode(STDOUT, ":utf8"); \
    print "\x{201C}Unicode \x{2018}\x{263A}\x{2019} Please\x{201D}";' |\
      magick -background lightblue -fill blue -pointsize 36 \
              label:@-  label_unifun.gif

[IM Output]

Para mais informações e para consultar os códigos de caractere unicode de várias línguas e símbolos, veja Tabelas de Códigos de Caractere Unicode. Os caracteres unicode não só podem conter caracteres internacionais, mas, com a fonte certa, você também pode usar conjuntos especiais de 'símbolos' que ele define. O mais famoso deles é a fonte de símbolos 'DingBats'. Essa fonte se tornou tão comum que agora faz parte do conjunto de fontes Unicode padrão. Por exemplo, aqui extraio os primeiros 24 caracteres da área de símbolos unicode 'DingBats' usando um script de shell especial "**[graphics_utf](../static/img/scripts/graphics_utf)**" que escrevi para gerar um 'bloco' de caracteres unicode como texto UTF-8.

  graphics_utf -N 2701 2718 |\
    magick -font Mincho -pointsize 32 label:@-   label_dingbats.gif

[IM Output]

Os pontos de interrogação acima são caracteres específicos que não foram definidos nem pelo unicode, nem na fonte 'Mincho' do windows. Mais especificamente, o símbolo que fazia parte da fonte 'dingbat' original está presente no unicode, mas usando outro código de caractere unicode, diferente do código dingbat esperado. Veja a Tabela de Especificação Unicode dos Dingbats para mais detalhes, e sua referência ao caractere unicode correto a usar para os caracteres dingbat 'ausentes'. Em vez de um ponto de interrogação, muitas fontes apenas exibiriam uma caixa ou um caractere em branco para tais caracteres indefinidos. Se você vir muitos desses caracteres, ou caracteres ausentes na sua saída, provavelmente deveria estar usando uma fonte diferente. Outros conjuntos de símbolos também disponíveis como parte da enorme fonte de caracteres unicode incluem: símbolos rúnicos tolkanianos, símbolos matemáticos, algarismos romanos, setas, Braille e símbolos técnicos. É um conjunto grande para explorar, e o script de shell "**[graphics_utf](../static/img/scripts/graphics_utf)**" pode ajudá-lo a explorá-lo. Aqui está outro exemplo de caracteres unicode que a fonte 'Mincho' da Microsoft pode renderizar. Neste caso, da seção "Símbolos Diversos"...

  graphics_utf -N 2620 2630 |\
    magick -font Mincho   -pointsize 40 label:@- label_misc.gif

[IM Output]

Usar unicode em scripts DOS é muito mais difícil do que em UNIX e LINUX. Notas especiais sobre o uso de unicode nesse ambiente foram fornecidas por Wolfgang Hugemann, em Codificação de Caracteres no Windows.

Fontes de Símbolos

Mais comumente usadas por pessoas que procuram imagens de texto especiais, são as 'fontes de símbolos' especiais. Elas são muito menores do que a fonte Unicode grande completa, pois substituem apenas os caracteres ASCII normais e padrão (letras e números) por um conjunto diferente de formas e imagens específicas, embora às vezes (raramente) também tenham mais símbolos na área de meta-caracteres latinos. Os símbolos da fonte 'DingBat' começaram dessa forma, mas, como mencionado acima, agora fazem parte do conjunto de caracteres Unicode. Por exemplo, um símbolo que eu gosto bastante de usar vem da fonte "WebDings". É um símbolo de 'coração curvo' bastante bonito, que substitui o caractere 'Y' normal na definição dessa fonte...

  magick -size 20x20 -gravity center -font WebDings label:Y label_heart_20.gif
  magick -size 40x40 -gravity center -font WebDings label:Y label_heart_40.gif
  magick -size 60x60 -gravity center -font WebDings label:Y label_heart_60.gif
  magick -size 80x80 -gravity center -font WebDings label:Y label_heart_80.gif

O importante a lembrar é que todas as fontes truetype são, na verdade, um tipo especial de Formato de Imagem Vetorial. Com múltiplas imagens (uma para cada caractere) na fonte. Como são imagens vetoriais, isso significa que a fonte deve permitir que você 'desenhe' um caractere, forma ou símbolo em praticamente qualquer tamanho (escala), usando os controles fornecidos por "[-size](https://imagemagick.org/command-line-options/#size)", "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" e "[-density](https://imagemagick.org/command-line-options/#density)". Como você pode ver acima, o 'coração curvo' pode ser 'renderizado' em praticamente qualquer tamanho que eu desejar. Algumas fontes são muito especializadas. Por exemplo, você pode obter um arquivo de fonte da IDAutomation chamado "IDAutomationHC39M.ttf" que pode ser usado para gerar códigos de barras. Por exemplo... [IM Output] [IM Output] [IM Output] [IM Output]

|

  magick -font IDAutomationHC39M -pointsize 16 label:'*314-76*' \
          -bordercolor white -border 5x5  label_barcode.gif

[IM Output]
Aqui estão alguns outros símbolos interessantes que encontrei em várias fontes de símbolos que colecionei por um motivo ou outro...

  magick -pointsize 48 -font WebDings label:' " _ ~ ) - '  label_webdings.gif
  magick -pointsize 48 -font LittleGidding label:' x o w ' label_ltgidding.gif
  magick -pointsize 48 -font WingDings2      label:'ab'    label_wingdings2.gif
  magick -pointsize 48 -font Zymbols  label:' ? , - I Z '  label_zymbols.gif
  magick -pointsize 48 -font TattoEF  label:' B Y D I H '  label_tatooef.gif
  magick -pointsize 48 -font SoundFX  label:' V 3 t f 9 '  label_soundfx.gif

Esta é apenas uma pequena amostra do que está disponível. Bibliotecas enormes de praticamente todos os símbolos, formas ou imagens imagináveis estão disponíveis na WWW para você navegar e baixar. [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

| Lembre-se de que cada caractere desenhado tem duas partes separadas que podem ser desenhadas: a área 'preenchida' (que mostrei acima), e o 'traço' (stroke) ou contorno, que pode parecer muito diferente da área preenchida. Cada uma dessas áreas pode ser desenhada separadamente, ou em cores diferentes, então pode ser uma boa ideia examinar um símbolo ou forma promissor mais de perto, de várias maneiras. Você pode obter um resultado muito surpreendente. Veja Fontes Compostas, Traço para alguns exemplos de como fazer isso.
| _Muitos criadores de fontes de símbolos geram as formas usando um simples scanner e um conversor de bitmap para vetor, sem qualquer design ou limpeza adequados da imagem ou forma. Recomenda-se cautela ao examinar tais fontes 'escaneadas'.

A última fonte mostrada acima é um exemplo de uma fonte 'escaneada', dando-lhe uma aparência 'pontilhada' de baixa qualidade, quando comparada às outras fontes projetadas de forma mais adequada._
---|---

Kerning Entre Caracteres

A partir do IM v6.4.7-8, você pode usar "[-kerning](https://imagemagick.org/command-line-options/#kerning)" para inserir espaço extra entre caracteres, entre cada letra em strings de texto. Por exemplo |

  magick -pointsize 12               label:Anthony   label_kerning_0.gif
  magick -pointsize 12 -kerning 1    label:Anthony   label_kerning_1.gif
  magick -pointsize 12 -kerning 2.5  label:Anthony   label_kerning_2.gif
  magick -pointsize 12 -kerning 5    label:Anthony   label_kerning_5.gif
  magick -pointsize 12 -kerning -1   label:Anthony   label_kerning-1.gif

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
Observe que o valor real de kerning pode ser um valor de ponto flutuante, ou até mesmo um valor negativo. Para outro exemplo de uso de um valor de "[-kerning](https://imagemagick.org/command-line-options/#kerning)" negativo, veja o exemplo Fonte Composta Unida.

Espaçamento Entre Palavras

Também a partir do IM v 6.4.8-0, a opção "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)" pode ser usada para modificar o tamanho de um caractere de espaço usado entre palavras. Por exemplo |

  magick                       label:'I Love IM!'  label_wspace_off.gif
  magick -interword-spacing 1   label:'I Love IM!'  label_wspace_1.gif
  magick -interword-spacing 10  label:'I Love IM!'  label_wspace_10.gif
  magick -interword-spacing 25  label:'I Love IM!'  label_wspace_25.gif

[IM Output] [IM Output] [IM Output] [IM Output]
Observe como você não só pode aumentar o tamanho de um caractere de espaço entre as palavras, mas também diminuir o tamanho padrão. Observe, porém, que os espaços farão com que as palavras sejam realinhadas aos limites de pixel (ao contrário do Kerning Entre Caracteres acima), então a saída de um rótulo com espaços definidos como zero ainda será diferente de um rótulo que não contém nenhum espaço. Tanto o Kerning Entre Caracteres quanto o Espaçamento Entre Palavras também afetarão os resultados da capacidade do IM de ajustar automaticamente uma string de texto a uma imagem de tamanho específico. |

  magick -size 150x                       label:'I Love IM!' label_wsize_of.gif
  magick -size 150x -interword-spacing 25 label:'I Love IM!' label_wsize_25.gif
  magick -size 150x -interword-spacing 50 label:'I Love IM!' label_wsize_50.gif

[IM Output] [IM Output] [IM Output]
O que está acontecendo é que, ao definir o "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)", o tamanho do caractere de 'espaço' não muda mais junto com o resto do tamanho do texto. Assim, à medida que o IM tenta calcular o melhor "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", a quantidade de espaço entre cada palavra é fixa, e portanto não desempenha nenhum papel no ajuste do texto dentro da largura fixa fornecida. Como consequência, quanto maior o "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)", menor o tamanho de fonte necessário para realmente ajustar a linha de texto dentro da mesma largura de imagem especificada. Um valor negativo pode ser usado, e pode, de fato, fazer com que as palavras se sobreponham, ou produzir efeitos incomuns usando caracteres e fontes específicos. Mas torne-o negativo demais e comportamentos indefinidos podem começar a aparecer. Recomenda-se cautela se você tentar isso. Embora o exemplo acima não seja um exemplo de justificação de texto (embora pareça), você pode usar essas opções como ponto de partida para fornecer uma justificação de texto adequada. Se você realmente precisa desse nível de formatação e justificação de texto, então pode ser melhor olhar para outros métodos de gerar texto pré-formatado ou Postscript, como o software "TeX" ou "LaTeX" baseado em linha de comando. Melhor ainda, você poderia usar SVG (versão da biblioteca rsvg), ou a Linguagem de Marcação Pango (veja abaixo), para gerar texto justificado.

Espaçamento Entre Linhas

A partir do IM v6.5.5-8, outra opção foi adicionada: "[-interline-spacing](https://imagemagick.org/command-line-options/#interword-spacing)". Esta foi muito solicitada pelos usuários à luz das configurações anteriores, e de muitas maneiras é bem mais útil. Basicamente, ela adicionará ou subtrairá essa quantidade de pixels entre as linhas individuais de texto. Ou seja, você pode usá-la para expandir ou comprimir as linhas individuais de texto. Por exemplo....

  magick                        label:'First\nSecond'  label_lspace_off.gif
  magick -interline-spacing  5   label:'First\nSecond'  label_lspace_5.gif
  magick -interline-spacing 10   label:'First\nSecond'  label_lspace_10.gif
  magick -interline-spacing 20   label:'First\nSecond'  label_lspace_20.gif
  magick -interline-spacing -5   label:'First\nSecond'  label_lspace-5.gif
  magick -interline-spacing -10  label:'First\nSecond'  label_lspace-10.gif

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

Para fazer o melhor uso dessa configuração, você precisa ser capaz de calcular o espaçamento normal entre linhas para uma fonte específica. Esta é a definição real de "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", que, com a resolução atual ou a configuração "[-density](https://imagemagick.org/command-line-options/#density)", define o espaçamento entre linhas de uma fonte. Ela não define, na verdade, a altura real ou a espessura das linhas da fonte, embora afete esses aspectos de uma fonte específica. Então, tomando uma "[-density](https://imagemagick.org/command-line-options/#density)" de '72' pontos por polegada, e sabendo que, por definição, há 72 'pontos' por polegada, você pode calcular que uma fonte de 12 pontos terá um espaçamento entre linhas de 12 pixels. Com essa informação, você pode dar 'espaçamento duplo' às suas linhas de texto de 12 pontos usando uma configuração de "-interline-spacing 12". Isso adicionará 12 pixels extras entre as linhas. |

  magick -density 72 -pointsize 12 -interline-spacing 12  -font Arial \
          label:'First\nSecond\nThird'  label_lspace_double.gif

[IM Output]
Claro que, como visto anteriormente para o tamanho entre palavras, adicionar um número constante de pixels entre os elementos de texto tenderá a tornar o texto menor quando o tratamento automático de pointsize é usado. Ou seja, um "[-size](https://imagemagick.org/command-line-options/#size)" de imagem final é fornecido sem uma configuração "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)". |

  magick -size x70  -interline-spacing 18  -font Arial \
          label:'First\nSecond\nThird'  label_lspace_size.gif

[IM Output]
Usar um espaçamento entre linhas negativo também pode ser usado como um método rápido e improvisado de 'engrossar' (bolding) verticalmente uma linha, simplesmente repetindo essa linha e subtraindo 1 pixel a mais do que a separação da linha de base. |

  magick -density 72 -pointsize 12 -interline-spacing -13 -font Arial \
          label:'Bolded Word\nBolded'  label_lspace_vbold.gif

[IM Output]
Claro que isso não funcionará se você realmente quiser duas linhas, e não apenas texto em negrito. Também funciona melhor com uma fonte de largura fixa.


Caracteres de Escape Especiais em Argumentos de Texto

Já apresentamos os caracteres de escape especiais usados em vários argumentos de texto, acima. Especificamente, você pode escapar caracteres especiais como quebras de linha usando a barra invertida '\', ou você pode inserir informações extras na string usando escapes de porcentagem '%', conforme definido na página de Propriedades de Imagem. Também há um escape '@' especial que, se usado no início de uma linha, usará o restante do argumento de texto como um nome de arquivo do qual ler os dados do arquivo especificado (ou STDIN se '-' for usado). Alguns sistemas (como o ubuntu) desabilitam o uso do escape '@{file}' usando uma política de segurança. Digite magick -list policy para ver quais políticas estão presentes no seu sistema e de onde elas são definidas.
Esses caracteres de escape não só afetam "[-format](https://imagemagick.org/command-line-options/#format)", para uso pelo "magick identify" (assim como "[-identify](https://imagemagick.org/command-line-options/#identify)" e "[info:](files.html#info)"), mas também afetam os geradores de texto para imagem "[label:](#label)" e "[caption:](#caption)", e controlam as opções de configuração de metadados de imagem "[-label](https://imagemagick.org/command-line-options/#label)", "[-comment](https://imagemagick.org/command-line-options/#comment)", "[-caption](https://imagemagick.org/command-line-options/#caption)". E, finalmente, eles também são usados por "[-annotate](https://imagemagick.org/command-line-options/#annotate)". _Enquanto a barra invertida '\' é usada pelo método 'text' do "[-draw](https://imagemagick.org/command-line-options/#draw)", os escapes de porcentagem '%' não são, pois interferem na manipulação de imagens SVG do ImageMagick. Esta foi uma das razões pelas quais o operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" foi criado para a versão 6 do IM.


---|---
O outro ponto importante sobre caracteres de escape é que, embora eles sejam usados para argumentos de texto na linha de comando, em nenhum momento eles se aplicam aos dados sendo lidos de um arquivo de texto (normalmente lidos usando o escape '@'). Isso significa que você não precisa se preocupar em escapar 'escapes' para dados de arquivo de texto, mas também significa que você tem que processar os dados do arquivo você mesmo, fora do IM, se precisar inserir informações no texto. | _A proteção do arquivo de texto de entrada contra a manipulação de escapes foi finalizada na versão 6.3.3 do IM.

---|---
Por exemplo, aqui defino e relato os metadados 'label' e 'comment' de uma imagem usando os dois métodos para definir essa informação a partir de um arquivo de texto de origem. O arquivo "info.txt" contém a string [IM Text], (sem quebra de linha final). |

  magick -label   @info.txt  rose:     -format '%l label'   info:
  magick -comment @info.txt  rose:     -format '%c set "'   info:
  magick rose: -set label   @info.txt  -format '%l caption' info:
  magick rose: -set comment @info.txt  -format '%c set "'   info:

| [IM Text]

Observe que o IM não expandiu nenhuma das sequências de caracteres de escape que ele leu usando o escape de leitura de arquivo '@'. Isso é importante, pois significa que sempre que o IM lê texto de um arquivo, ele nunca manipulará nenhum caractere especial que estivesse presente nesse arquivo.

O IM lê arquivos de texto como texto literal, sem nenhum escape

Infelizmente, isso também inclui qualquer quebra de linha final que possa estar presente no arquivo (ou fluxo) que está sendo lido! Isso pode resultar em uma linha 'em branco' extra na imagem resultante, quando o texto de entrada tem uma quebra de linha no final (uma prática muito comum). Por exemplo... |

  echo "Anthony" | magick label:@-  label_stdin.gif

[IM Output]
Como você pode ver, o rótulo não só continha a string de entrada, mas também uma linha em branco extra devido ao caractere de quebra de linha que o comando "echo" adicionou no final. Se você não quiser essa quebra de linha final, você precisará removê-la você mesmo. Isso, no entanto, pode ser uma questão complicada, dependendo de onde e como o texto é obtido ou criado, e de qual API você está executando o IM. A melhor maneira é tentar não gerar essa quebra de linha final desde o início. Por exemplo, usando uma flag '-n' no "echo". |

  echo -n "Anthony" | magick label:@-  label_stdin_2.gif

[IM Output]
Ou usando algo que não adicione quebras de linha extras a menos que você as solicite especificamente. |

  printf "Anthony" | magick label:@-  label_stdin_3.gif

[IM Output]
Ou você pode 'descartar' essa quebra de linha final usando um pequeno e engenhoso comando de uma linha em perl... |

  echo "Anthony" | perl -0777 -pe 's/\n$//' |\
     magick label:@-  label_stdin_4.gif

[IM Output]
Em outras APIs, você pode procurar por essa quebra de linha final antes de alimentar o texto a um comando IM via uma 'abertura de pipe' (piped open).

Escapes de opção definidos pelo usuário

Um grande problema é tentar usar informações escapadas de uma imagem em alguma outra imagem, como ao gerar uma imagem "[label:](#label)" ou "[caption:](#caption)" separada. Este é um problema muito difícil, e a solução atual (para uma única imagem) é criar uma 'opção de usuário' especial, que é anexada a uma imagem que está sendo processada. Essa 'configuração' pode então ser consultada por "[label:](#label)", "[caption:](#caption)" ou "[-annotate](https://imagemagick.org/command-line-options/#annotate)", como uma sequência de escape de porcentagem, quando necessário. Por exemplo, aqui crio uma imagem de rótulo completamente nova usando informações da imagem rose interna. Essa imagem de origem das informações é então deletada, embora eu pudesse facilmente anexar o novo rótulo à imagem original. |

  magick rose: \
          -set option:roseinfo 'rose image\nsize = %w x %h\nwith %k colors' \
          label:'%[roseinfo]'  -delete 0   label_escape.gif

[IM Output]
Sim, o exemplo acima é complicado, mas isso se deve a algumas limitações da biblioteca central interna do IM que estão envolvidas. Veja Acessando Dados de outras imagens para mais detalhes.

Escapando Escapes

Se você precisa alimentar uma string como argumento ao IM (especialmente como uma chamada de API), mas não quer que o IM expanda os escapes, você pode simplesmente 'escapar' todos os três escapes usando uma barra invertida extra '\'. Observe que o '@' só precisa ser 'escapado' se for o primeiro caractere, e, para compatibilidade retroativa, os escapes de porcentagem também podem ser escapados duplicando-os. Ou seja, '%%' produzirá uma única porcentagem. Por exemplo... |

  magick -background lightblue -fill blue -font Candice -pointsize 48 \
          label:'\@ \\n \% 5%% '    label_escapes.gif

[IM Output]
| Antes da versão 6.3.2 do IM, você não podia usar uma barra invertida para escapar um '@' inicial e desativar a função 'ler de um arquivo'. Nesse caso, a única maneira de escapar um '@' inicial era lê-lo de um arquivo. Isso não era muito prático em APIs.
---|---
Aqui está um exemplo semelhante de 'escapar os escapes' para "[-annotate](https://imagemagick.org/command-line-options/#annotate)"... |

  magick rose: -fill white -stroke black  -font Candice  -pointsize 20 \
          -gravity center   -annotate 0 '\@ \\n 5%%'  annotate_escapes.gif

[IM Output]
Claro que, como mostrado anteriormente, ler o texto de um arquivo (usando o escape '@') será sempre tratado como literal, sem nenhum significado especial. Isso evita a necessidade de qualquer pré-processamento do texto; apenas fique atento a quaisquer quebras de linha finais. |

  echo -n '@ \n 5%' |\
    magick rose: -fill white -stroke black  -font Candice  -pointsize 20 \
            -gravity center    -annotate 0 '@-'   annotate_escapes_file.gif

[IM Output]
Em outras palavras, ao ler de um arquivo, você não precisa se preocupar em escapar coisas, mas pode simplesmente escrever exatamente o texto que você quer que o IM use.

Escapes em Versões Mais Antigas do IM

As definições acima só foram finalizadas na versão 6.3.3 do IM. Antes disso, os escapes eram às vezes manipulados em algumas opções, e às vezes não, de acordo com quaisquer solicitações, problemas e reclamações enviadas pelos usuários do IM. Este era especialmente o caso no que diz respeito aos escapes de porcentagem com "[label:](#label)" e "[caption:](#caption)", que, por um período, foram considerados 'sem sentido'. Por exemplo, se você vê um '%c' na imagem de rótulo a seguir depende muito da versão (pelo menos antes do IM v6.3.3). |

  magick -background lightblue -fill blue -font Candice -pointsize 48 \
          label:'ab%cde'    label_percent.gif

[IM Output]
Se você vê um 'abde' (escape de porcentagem aplicado) ou 'ab%cde' (porcentagem não aplicada) depende exatamente de qual versão do IM você está usando. | _No IM v6.2.4, os escapes de porcentagem foram removidos de "[label:](#label)" e "[caption:](#caption)" por serem sem sentido.

No entanto, eles retornaram no IM v6.3.2, como uma nova construção '%[fx:...], que pode referenciar qualquer imagem, tornando os escapes de porcentagem em geradores de texto para imagem úteis novamente. Veja Escapes de Expressão FX._
---|---
Esse 'o que é escapado' também era um problema no que diz respeito à manipulação de escapes a partir de arquivos. Antes do IM v6.3.3, o exemplo a seguir teria produzido duas linhas, em vez de uma única linha. |

  echo -n ' Love \n/ Hate ' |\
    magick -background lightblue -fill blue -font Ravie -pointsize 18 \
            label:@-    label_escapes_file.gif

[IM Output]
Como os resultados da manipulação de escapes variam muito de versão para versão, em IMs mais antigos que a v6.3.3, recomendo que os scripts testem sua manipulação de escapes, ajustando-se se isso for importante para o funcionamento correto dos programas. Se alguém gostaria de criar um teste automático para scripts IM, por favor contribua. Ou, se você encontrar um teste assim, por favor me avise.


Pango - Texto Formatado Básico

O codificador de texto "pango:" (totalmente funcional a partir do IM v6.7.6-3) funciona de maneira muito semelhante aos codificadores Label e Caption. Ele fornece uma linguagem de formatação de texto limitada em sistemas nos quais o "Pango" está instalado. Em sistemas Linux e MacOSX, o pango é padrão; no Windows, é opcional. Aqui está um exemplo simples sem usar nenhuma formatação especial do pango... |

  magick -background lightblue pango:"Anthony Thyssen" pango.gif

[IM Output]
No entanto, você deve observar que alguns dos Atributos de Texto anteriores não funcionarão com o pango, basicamente devido aos seus requisitos de formatação de texto. Por exemplo, embora você possa definir uma cor "[-background](https://imagemagick.org/command-line-options/#background)", você não pode definir o fill padrão, ou a undercolor, nem a fonte específica a usar. Isso porque esses atributos são selecionáveis via Linguagem de Marcação Pango (veja abaixo). Recomenda-se que você use "[-size](https://imagemagick.org/command-line-options/#size)" para definir os limites de largura e altura da imagem de saída, à qual o pango quebrará automaticamente o texto de entrada por palavras (ou por caractere, para o chinês). |

  magick -background lightblue -size 150 \
          pango:"Anthony Thyssen is the main author of IM Examples" \
          pango_size.gif

[IM Output]
E você pode até fazer o Pango 'justificar' o texto adequadamente usando o Define, "pango:justify"... |

  magick -background lightblue -size 150  -define pango:justify=true \
          pango:"Contributions to IM Examples are welcome via the IM Forum." \
          pango_justify.gif

[IM Output]
Observe, porém, que, embora o texto possa ser justificado, espaços e quebras de linha ainda são levados em conta pelo formatador de texto. Além disso, o pango compreende o uso de TABs (ao contrário de label e caption). |

  printf "col1\tcol2\nabc\txyz\n123\t789" |\
     magick -background lightblue  pango:@-  pango_tabs.gif

[IM Output]
| Observe que, embora o comando "printf" acima possa gerar caracteres de tabulação, usando o escape '\t', o IM não compreende o uso de tal escape. Ele, no entanto, compreende a sequência de escape '\n' em strings.
---|---
No entanto, gerar colunas usando TABs não funciona muito bem, pois você não pode definir facilmente os 'tab-stops' fora da API. Por isso, usar TABs dessa forma não é recomendado, exceto como indentação de linha e parágrafo.

Linguagem de Marcação Pango

O verdadeiro poder do pango, porém, está na linguagem "Pango Markup", que é habilitada por padrão. Você pode desativar a marcação pango usando "-define pango:markup=false", mas então você poderia muito bem estar usando Caption em vez disso. A "Pango Markup" é muito parecida com HTML, no sentido de que você usa um conjunto de tags de marcação "<...>" ocultas no texto, e que são usadas para controlar como o texto deve ser formatado. Aqui estão alguns guias sobre a Linguagem de Marcação (sem o entulho de API)

Por exemplo.. |

  magick -background lightblue -gravity center -size 180x \
          pango:"The <b>bold</b> and <i>beautiful</i>" \
          pango_formatting.gif

[IM Output]
A tag "<span ... >" é a principal tag a usar na marcação pango. Ela permite que você controle o tamanho, a cor e a posição exatos do texto contido. Por exemplo..

  magick -background lightblue \
       pango:'  Some  <span size="49152" rise="-20480"
                foreground="red" background="blue"
                 > Big Red on Blue </span>  Text  ' \
       pango_span.gif

[IM Output]

Observe que a maioria dos valores numéricos é multiplicada por um fator de 1024; por isso, o valor de "size="49152"" no exemplo acima significa um pointsize de texto de 48 pontos. Já o rise negativo ("rise="-20480") significa abaixar a posição do texto em 20 pontos (ou pixels a 72dpi). Mas, em vez de especificar um pointsize para o texto, eu também posso usar um rótulo de tamanho especial, como "size="x-large"". Veja o código-fonte do próximo exemplo. Fique atento às aspas dentro de aspas no exemplo acima. As aspas dentro das tags são obrigatórias. No entanto, quebras de linha e espaço extra dentro das tags não desempenharão nenhum papel na formatação do texto. Por isso, ocultar quebras de linha extras em tags de marcação, ou em um comentário de marcação "<!-- ... -->", pode ser muito útil. Novamente, veja o texto-fonte do próximo exemplo. Como exemplo final do poder da formatação pango, aqui o uso para formatar um arquivo previamente preparado "[pango_test.txt](../static/img/images/pango_test.txt)". Ele contém a maioria das tags de marcação pango comuns que você provavelmente usará. Compare este arquivo de marcação com a imagem resultante abaixo.

  magick -gravity center pango:@pango_test.txt  pango_test.png

[IM Output]

Notas e Problemas do Pango

Gravidade
Não consegui fazer o pango centralizar seletivamente apenas uma única linha de texto. Você só pode centralizar tudo, ou nada, via a configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)". A razão para isso parece ser que o pango é projetado para gerar rótulos de texto separados para aplicações. Ou seja, os títulos geralmente são gerados separadamente do corpo principal do texto exibido. O Pango não foi feito para ser um mecanismo de formatação de páginas de texto em larga escala.
Fontes
O Pango pode mudar de fonte no meio da renderização. Ele já faz isso facilmente para texto em negrito e itálico. No entanto, a especificação de fonte vem do GTK, e por isso usa um sistema diferente do ImageMagick em geral. Você pode descobrir mais sobre fontes usando o GTK, executando o programa "gtk-demo", e clicando duas vezes em "Pickers" e no "Text Widget".
Defines
Há muitos Defines especiais que podem ser usados para controlar globalmente vários aspectos da formatação de texto do pango. Estes estão atualmente listados nos Formatos de Arquivo Pseudo, embora eu mesmo não tenha explorado todos eles. Estes são os que usei...
-define pango:markup=false
Desativa as tags da linguagem de marcação. Quaisquer tags são então incluídas na saída. Nenhuma formatação pango dentro do texto é possível. isso é especialmente útil na depuração, permitindo que você veja exatamente o que o pango vê como sua entrada.
-define pango:justify=true
Justifica o texto ao longo da largura do tamanho da imagem. Ou seja, adiciona espaçamento extra entre palavras de modo que tanto a borda esquerda quanto a direita de um bloco de linhas de texto fiquem alinhadas.

Mais Informações sobre o Pango

Para ver exatamente o que é possível, veja a Galeria de Scripts Pango. Se você fizer algo interessante com o pango, por favor contribua. Ou me envie um e-mail (Endereço no rodapé da página), ou poste no Fórum de Discussão do IM. Em sistemas com o pango instalado, você também pode usar o comando "pango-view" para gerar imagens formatadas pelo pango. No entanto, sua configuração padrão de 'densidade' ou 'dpi' é a do seu monitor (o IM usa 72 dpi por padrão) e, por isso, pode variar de host para host.

Text - Páginas de Texto Simples

O formato de entrada "text:" é projetado para transformar, com a magia do IM, texto simples em imagens consistindo de uma imagem por página de texto. É o operador de entrada de 'texto paginado' do ImageMagick. Em outras palavras, seu propósito é transformar arquivos de texto pré-formatado maiores em páginas, da mesma forma que as impressoras imprimem texto simples em folhas de papel separadas. | _Não confunda o formato de entrada de arquivo "text:" com o formato de entrada "[txt:](files.html#txt)" semelhante. Este último primeiro tentará ler o arquivo como um formato de imagem 'enumeração de pixels IM'.

Isso não significa que um arquivo de texto simples com um ".txt" falhará. De fato, tal arquivo provavelmente será convertido como você esperaria, pois o formato de arquivo "[txt:](files.html#txt)" recairá automaticamente para o formato "text:" se uma imagem enumerada não for reconhecida.

_
---|---
A manipulação de texto dessa forma, porém, tinha uma série de problemas. Primeiro, o texto é desenhado em uma tela grande, deixando você com o problema de remover o espaço não utilizado, se tal espaço não for desejado. O outro é que as linhas não têm 'quebra por palavras' (word-wrap), mas transbordarão a tela e serão truncadas se forem muito longas. E, finalmente, para arquivos de texto muito longos, múltiplas páginas (imagens) serão geradas, a menos que algumas precauções extras sejam tomadas. Por outro lado, "text:" manipulará praticamente qualquer arquivo de texto, sem modificar o tamanho final da imagem produzida, ou quebrar por palavras linhas muito longas. Você também não precisa pré-processar caracteres especiais como faria se usasse o texto na linha de comando. Finalmente, e mais importante, se uma fonte de largura fixa (como Courier) for usada, arquivos com colunas de dados espaçadas ainda terão esses dados em colunas espaçadas. Basicamente, "text:" transformará o arquivo de entrada 'COMO ESTÁ' (AS IS), com a magia do IM. | _Os dados de texto de entrada lidos do arquivo são essencialmente passados diretamente à biblioteca de fontes para desenhar o texto UTF. Como consequência disso, alguns caracteres de controle podem ser desenhados usando 'glifos' incomuns. Isso inclui os caracteres TAB e FORMFEED, que, no momento em que isto foi escrito, a biblioteca 'freetype' interpreta de forma errada.

Se isso for uma preocupação, você pode querer pré-processar seu arquivo de texto usando um programa de filtro, como "expand", para transformar caracteres TAB no número apropriado de espaços._
---|---
Ao desenhar texto, uma grande página de tamanho 'carta' (letter) é criada (ou o tamanho ou tipo de página especificado com "[-page](https://imagemagick.org/command-line-options/#page)") na resolução atual (definida com "[-density](https://imagemagick.org/command-line-options/#density)"). Por padrão (a 72 dpi), isso terá '612x792' pixels de tamanho, o que, para a maioria dos propósitos, é muito grande. Por exemplo, aqui está uma conversão direta do manual em texto simples do comando "magick" em uma imagem (é grande, então, para vê-la, selecione a imagem da 'página' à direita)... |

  man magick | col -b | expand | \
    magick -font CourierNew  text:- -delete 1--1 text_manpage.gif


| _A conversão de manual para imagem acima, porém, gera múltiplas páginas (imagens), então eu Deletei a segunda e as demais, para ficar apenas com a primeira página, em vez de uma animação GIF de todas as páginas.

Eu também poderia ter anexado um Modificador de Leitura, '[0]' ao nome de arquivo de entrada, como "text:-'[0]'", para dizer ao IM para ler apenas a primeira imagem gerada. Embora, no momento, toda a seleção de página ainda seja manipulada gerando todas as páginas e deletando as páginas indesejadas._
---|---
Usei propositalmente a fonte de 'largura fixa' 'CourierNew' no exemplo acima de modo a preservar a formatação de espaçamento de caracteres presente na página impressa. Observe como esta saída difere daquela de caption: acima. A aparência geral desta imagem também pode ser melhorada usando as mesmas técnicas apresentadas na seção Postscript a seguir. Se você quer apenas saber, por exemplo, qual o tamanho de uma página 'A5' a 100 dpi, então este comando gera uma única página em branco, desse tamanho, e retorna seu tamanho em pixels. O nome de arquivo, "/dev/null", é um arquivo UNIX especial que está sempre vazio.

  magick -page A5 -density 100 -units PixelsPerInch  text:/dev/null \
          -format 'Page Size at %x = %w x %h pixels'  info:

[IM Text]

Aparando Páginas de Texto

Como o texto está sendo 'desenhado' em uma tela grande, você provavelmente vai querer remover todo o espaço não utilizado produzido. Isso pode ser feito usando as operações de imagem "[-trim](https://imagemagick.org/command-line-options/#trim)", "[+repage](https://imagemagick.org/command-line-options/#repage)", e então, para deixá-lo com aparência razoável, readicionando algum espaço nas bordas usando "[-border](https://imagemagick.org/command-line-options/#border)". Claro que você também precisará igualar a cor "[-background](https://imagemagick.org/command-line-options/#background)" que usou com a "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" que está readicionando. Parece complexo? Não é, na verdade; por exemplo...

  echo "    Hello Cruel World    " |\
    magick -background  lightblue  -fill blue  -pointsize 18 \
            text:-    -trim +repage  -bordercolor lightblue  -border 3 \
            text_trimmed.gif

[IM Output]

No exemplo acima, "[-trim](https://imagemagick.org/command-line-options/#trim)" é usado para remover a vasta quantidade de espaço em branco extra na imagem de página "text:". Isso, no entanto, também removerá quaisquer espaços iniciais à frente de uma linha! Há, porém, uma técnica interessante que permitirá que você apare ("[-trim](https://imagemagick.org/command-line-options/#trim)") a imagem até o tamanho do texto realmente desenhado na página, incluindo quaisquer espaços iniciais e finais na entrada. Isso usa uma configuração "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" especial (examinada em detalhe mais adiante).

  echo "    Hello Cruel World    " |\
    magick -background  white -undercolor lightblue  -fill blue \
            -pointsize 18   text:-  -trim +repage \
            -bordercolor white  -border 3    text_boxed.gif

[IM Output]

O espaço extra na parte inferior do texto é resultado do último caractere de 'quebra de linha' na entrada de texto, criando uma linha em branco extra na imagem. Mas, como você pode ver, os espaços iniciais e finais do texto de entrada foram preservados. Se você usar uma cor de fundo transparente no exemplo acima, você pode então achatar (flatten) a imagem aparada para transformar as áreas não desenhadas na mesma cor que a 'undercolor' usada.

  echo "    Hello Cruel World    " |\
    magick -background  none  -undercolor lightblue  -fill blue \
            -pointsize 18   text:-  -trim +repage  \
            -bordercolor lightblue  -border 3 \
            -background lightblue  -flatten    text_box_trimmed.gif

[IM Output]

O resultado do exemplo acima (exceto pelo "[-border](https://imagemagick.org/command-line-options/#border)" adicionado) é, na verdade, quase exatamente o que o IM agora produz usando um "[label:](#label)" e lendo de um nome de arquivo escapado com '@'. No entanto, "[label:](#label)" o faz de uma maneira mais rápida e muito mais limpa (via a biblioteca "freetype", em vez de uma conversão postscript). Você pode especificar um tamanho de "[-page](https://imagemagick.org/command-line-options/#page)" menor, seja em pixels (veja o próximo exemplo), ou usando um tamanho de página de mídia (como 'A5'), usando a configuração de resolução em pixels ou "[-density](https://imagemagick.org/command-line-options/#density)". Você também pode especificar o deslocamento em que começar a desenhar o texto na página, em relação ao canto superior esquerdo. Por exemplo...

  echo "This is a long line that shows that 'text:' does not word wrap." |\
     magick -background  lightblue  -pointsize 18 \
             -fill blue  -page 320x95+50+10  text:-'[0]' +repage  text_page.gif

[IM Output]

| _Quase todos os outros operadores de criação de imagem usam a configuração "[-page](https://imagemagick.org/command-line-options/#page)" para definir uma 'tela' (canvas) virtual maior e um 'deslocamento' (offset) para a imagem nessa tela, geralmente com o propósito de sobrepor imagens em camadas ou gerar animações. Por causa disso, provavelmente é uma boa ideia redefinir sua configuração de página usando "[+page](https://imagemagick.org/command-line-options/#page)" após qualquer operação "text:" ou "ps:", ou você pode obter resultados inesperados para quaisquer imagens secundárias que possa ler posteriormente na mesma linha de comando.

É também por isso que adicionei um operador "[+repage](https://imagemagick.org/command-line-options/#repage)" ao exemplo acima; caso contrário, o texto fica deslocado, e a imagem gerada também fica deslocada!

Para mais detalhes sobre o uso desse deslocamento, veja Atributos de Página de Imagem.
---|---
Observe como, no último exemplo, qualquer linha de texto que seja longa demais para caber na largura da página transbordará a página, e não será 'quebrada' (wrapped). Isso efetivamente cortará e descartará o final das linhas. Além disso, se houver linhas demais, então "text:" gerará _múltiplas páginas
e, portanto, múltiplas imagens, uma para cada página gerada pela tradução postscript do arquivo de texto. Se você está interessado apenas na primeira página de texto, ou simplesmente quer evitar a possibilidade de múltiplas imagens, adicione um '[0]' ao nome de arquivo "text:", para dizer ao IM para ler apenas a primeira página gerada após o texto ter sido convertido em imagens (veja o exemplo anterior).

Postscript/PDF - Entrada de Texto e Gráficos Pré-formatados

(ou outros formatos de imagem vetorial)

O que se segue apresenta uma técnica padrão de manipulação de imagem vetorial que pode ser usada não apenas para imagens "PS:" (postscript), mas para todas as outras imagens manipuladas usando gráficos vetoriais. Isso inclui formatos de imagem como: "PDF:" (portable document format), "[TEXT:](#text)" (texto simples paginado), e até "[SVG:](draw.html#svg)" (scaled vector graphic) e "[WMF:](formats.html#wmf)". Este método pode ser expandido para lhe dar um controle muito fino de exatamente como o texto ficará como imagem. Por exemplo, com o filtro 'texto para postscript' certo, você pode controlar a quebra de linha por palavras, justificações, manipulação de múltiplas fontes, negrito, bordas, títulos, nomes de arquivo, datas, e outros adornos na imagem postscript. No entanto, como esta seção é sobre texto para imagem, isso significa que você precisa primeiro transformar, com a magia do IM, seu texto em um arquivo postscript formatado. Há muitos programas externos que podem ser usados para fazer isso. Por exemplo, "a2ps", "enscript" ou "pstext". Essencialmente, você pode usar um processador de texto (como 'OpenOffice' ou 'Word', ou até 'Notepad'), OU, se você quer um sistema de processamento de texto em lote, você poderia usar 'TeX' e 'LaTeX' para gerar seu texto pré-formatado (veja Um Sistema Completo de Processamento de Texto abaixo). Todos esses programas são projetados para lidar com a complexidade de misturar texto simples, negrito, de tamanhos diferentes, e fontes diferentes, juntamente com controles de quebra de linha por palavras, justificação e divisão de parágrafos. A saída desses programas pode então ser passada ao IM para convertê-la em uma imagem do tamanho e qualidade que você desejar. Então, vamos primeiro gerar algum postscript (convertendo texto de um programa de fortunas pessoal). |

  mesgs LN-ManKzinWars | \
    a2ps -q -1 --rows=10 --prologue=bold \
         --center-title="Postscript via 'a2ps'" \
         --header='' --left-footer='' --right-footer='' \
         -o ps_version.ps


Agora podemos transformar isso, com a magia do IM, em uma imagem, aparando o resultado (como nos exemplos de "text:" acima) para remover as áreas em branco excessivas da página/tela padrão gerada.

  magick ps_version.ps'[0]' \
          -trim +repage   -bordercolor white -border 3  ps_version_raw.gif

[IM Output]

Observe o uso de '[0]' para limitar a entrada apenas à primeira página. Se sua imagem postscript gerar múltiplas páginas, ela ainda será completamente processada pelo delegado "ghostscript", mas o IM lerá apenas a primeira imagem retornada, em vez de gerar múltiplas imagens, uma imagem por página. Se seu postscript for muito grande, você pode querer usar outros utilitários postscript para limitar o número de páginas antes de processá-lo com o IM e o "ghostscript". Como você pode ver, o postscript convertido para a "[-density](https://imagemagick.org/command-line-options/#density)" padrão de 72 dpi, frequentemente não fica tão bom quanto deveria, com apenas uma quantidade mínima de anti-aliasing. Este é particularmente o caso ao lidar com fontes postscript, que não são projetadas para funcionar nessas baixas resoluções. Para melhorar isso, você pode usar uma técnica de Super Amostragem para gerar uma imagem melhor. Neste caso, você pede ao "ghostscript" para desenhar a página em uma resolução mais alta (ou "[-density](https://imagemagick.org/command-line-options/#density)" da imagem). Você pode então usar "[-resample](https://imagemagick.org/command-line-options/#resample)" (um redimensionamento especializado) para trazer essa imagem maior de volta a uma densidade de resolução de tela mais 'normal'.

  magick -density 196   ps_version.ps'[0]' -resample 72 \
          -trim +repage   -bordercolor white -border 3  ps_version.gif

[IM Output]

O valor '196' é 3 vezes os 72dpi finais, o que significa que, quando "[-resample](https://imagemagick.org/command-line-options/#resample)" é usado, aproximadamente 3×3 pixels são mesclados em cada pixel. Isso produz pixels de anti-aliasing melhores ao longo das bordas do texto, melhorando a aparência geral do resultado. Observe também que usar uma densidade ou resolução maior não é exatamente o mesmo que apenas ampliar uma fonte. As definições da fonte poderiam ter ajustes para lidar com situações de baixa resolução. Por exemplo, compare o buraco da letra 'e' nas duas imagens. A versão original é mais nítida devido a uma manipulação especial dentro da fonte, embora, no geral, a versão super amostrada seja mais clara. Para mais informações, veja Resolução, Pointsize e Tamanho Real da Fonte abaixo. Você não precisa usar os valores acima, pois às vezes um valor ligeiramente diferente pode produzir um resultado melhor ou mais desejável. Claro que fazer o "ghostscript" gerar uma imagem 2, 3, ou até 4 vezes maior também significa que o IM levará 4, 9 ou 16 vezes mais tempo para gerar a imagem! Ele também usará muito mais memória e espaço temporário em disco! Mas os resultados geralmente valem a pena. A melhor ideia é simplesmente testar para seu próprio documento, e ver o que lhe dá os melhores resultados. Além disso, se você precisar de mais anti-aliasing, em vez de usar uma resolução de entrada ainda maior, você poderia tentar borrar (blur) a imagem por uma quantidade subpixel (digamos '-blur 0x0.7') antes de reduzir seu tamanho. Eu também às vezes descobri que uma quantidade muito pequena de unsharpening após o redimensionamento (uma técnica comum do photoshop) pode melhorar o resultado final geral.

  magick -density 196   ps_version.ps'[0]' \
          -blur 0x0.7 -resample 72 -unsharp 0x0.7 \
          -trim +repage   -bordercolor white -border 3  ps_unsharp.gif

[IM Output]

Mas eu teria cuidado com esses ajustes, pois eles podem piorar as coisas.
Se você gostaria de ter um fundo transparente em vez de branco, você pode especificar uma configuração de "[-channel](https://imagemagick.org/command-line-options/#channel)" de 'RGBA', para incluir o canal alfa na imagem. Claro que você precisará usar um formato de imagem que possa lidar com cores semi-transparentes.

  magick -channel RGBA -density 196  ps_version.ps'[0]' -resample 72 \
          -trim +repage   -bordercolor none -border 3  ps_transparent.png

[IM Output]

Observe que o banner ainda usa uma cor esbranquiçada para seus fundos, em vez de também ser tornado transparente ou semi-transparente. Isso porque o postscript gerado, na verdade, desenha esse fundo, substituindo o fundo padrão da página (seja branco ou transparente). Tornar o fundo transparente dessa forma permitirá que você sobreponha sua imagem postscript sobre uma cor de fundo específica.

  magick ps_transparent.png -background skyblue -flatten  ps_bgnd_color.gif

[IM Output]

Usando um Método de Composição Alfa, você pode até sobrepô-la sobre uma imagem de fundo específica, ou um fundo ladrilhado (tiled).

  magick composite -tile bg.gif  ps_transparent.png  -compose DstOver \
            ps_bgnd_tiled.gif

[IM Output]

Como quase todas as impressoras postscript só podem escurecer o papel ou uma transparência de retroprojetor, (isso inclui impressoras coloridas), quando o exemplo acima for impresso, o banner seria tornado semi-transparente automaticamente. Se você também quer que o IM faça a mesma coisa que uma impressora faria, você pode usar uma composição alfa especial '[Multiply](compose.html#multiply)', para sobrepor a imagem de 'fundo branco' sobre o fundo de 'papel' desejado.

  magick composite -tile bg.gif  ps_version.gif  -compose Multiply  ps_multiply.gif

[IM Output]

Se você tem uma imagem postscript colorida, você também pode simular uma impressora puramente em preto e branco sobre papel colorido usando o método de composição especial '[BumpMap](compose.html#bumpmap)'. Isso converterá a imagem de sobreposição de origem para escala de cinza, antes de usar multiply para compor as imagens juntas. Você também pode gerar o equivalente em escala de cinza de uma transparência de retroprojetor. Isso basicamente usa a imagem de fundo branco, opaca (de cima) como uma 'máscara' a partir da qual definir uma imagem transparente em forma, usando o Operador de Forma Alfa

  magick ps_version.gif -negate -background black -alpha shape  ps_overhead.png

[IM Output]

Como o conversor "[text:](#text)" acima, o conversor "ps:" também faz uso da configuração "[-page](https://imagemagick.org/command-line-options/#page)" para definir o tamanho da tela da 'mídia' de imagem sobre a qual a página é desenhada. Embora o deslocamento fornecido seja ignorado. No entanto, como a maioria dos arquivos postscript define o tamanho da mídia de desenho internamente, isso normalmente não é necessário. | _A maioria dos outros operadores de criação de imagem usa a configuração "[-page](https://imagemagick.org/command-line-options/#page)" para definir uma 'tela virtual' e um deslocamento nessa tela virtual (por exemplo, para gerar animações GIF). Por isso, provavelmente é uma boa ideia redefini-la usando "[+page](https://imagemagick.org/command-line-options/#page)" após usá-la para uma operação de leitura de imagem "text:" ou "ps:", caso contrário, você pode obter resultados inesperados com as imagens posteriores.

Para mais detalhes sobre o uso desse deslocamento, veja Atributos de Página de Imagem._
---|---
Como exemplo prático final, dê uma olhada na minha imagem Tetraedro Renderizado por Ray Tracing. Outras imagens semelhantes podem ser vistas em Estudos sobre Poliedros. A página de fundo foi gerada a partir dos mesmos dados usados para produzir o objeto matemático 3D exibido. Os dados de texto foram convertidos usando "a2ps", e então o IM foi usado para transformar isso, com sua magia, em uma imagem. Sobre essa imagem, outros desenhos de linha previamente preparados do mesmo objeto matemático foram adicionados à página. Esta imagem final (salva em formato 'targa' ou TGA) foi então passada ao ray-tracer "[PovRay](http://www.povray.org/)" para inclusão na imagem final ou cena renderizada por ray tracing.

Usando o GhostScript Diretamente

Embora isto não seja estritamente IM, Richard Bollinger relatou que executar o delegado "ghostscript" diretamente é muito mais eficiente, produzindo um processamento uma ordem de magnitude mais rápido devido a menos manipulação de arquivos pelo IM. Por exemplo, em vez de executar...

  magick -density 300x300 -compress Group4 file.ps  file.tif

Você pode fazer o GhostScript fazer isso diretamente.

  gs -dBATCH -dNOPAUSE -sDEVICE=tiffg4 -r300x300 \
     -sOutputFile=file.tif  file.ps

Isso evita a necessidade de o IM gerar um arquivo temporário grande (para segurança e manipulação de imagem em pipeline). Como resultado disso, o uso direto do GhostScript pode poupar bastante manipulação de arquivos e processamento de E/S (IO), e pode produzir um grande ganho de desempenho ao processar arquivos postscript e PDF. No entanto, o "ghostscript" não pode redimensionar imagens (além de ajustar a densidade ou resolução de saída) e provavelmente não será capaz de produzir a imagem no formato de arquivo de imagem que você precisa, ou na qualidade que você quer. Mas você sempre pode então alimentar a saída do GhostScript ao ImageMagick para terminar a tarefa. Ou seja, especialmente o caso se você quer super amostrar os resultados (entrada de resolução mais alta, para saída redimensionada menor). O GhostScript pode ser um programa difícil de descobrir como usar, ou de corrigir para tipos específicos de postscript. O Cristy batalha constantemente com essas questões em nome dos usuários do IM, e nisso ele fez um esforço excelente. Infelizmente, ao lidar com as muitas coisas que podem (e de fato) acontecer, o IM não pode fornecer um método simplificado para postscript/PDF via GhostScript.

Draw - Desenhar Texto em Tela Existente

Ao usar o operador de baixo nível "[-draw](https://imagemagick.org/command-line-options/#draw)" para desenhar a fonte, obtemos muito mais controle, especialmente quanto à posição exata da fonte, e ao tamanho da imagem em que ela é desenhada.

  magick -size 320x100 xc:lightblue  -font Candice -pointsize 72 \
          -fill blue  -draw "text 25,65 'Anthony'" text_draw.gif

[IM Output]

No entanto, para usá-lo, precisamos gerar uma imagem de fundo do tamanho apropriado para desenhar a fonte, o que pode ser complicado ao desenhar algum texto desconhecido. Veja Dimensionamento Automático de Imagens de Fonte para maneiras de resolver este problema. Muitas opções extras, além das opções de texto padrão, também afetam como "[-draw](https://imagemagick.org/command-line-options/#draw)" realmente desenha texto em uma imagem. Você não só pode especificar uma cor "[-fill](https://imagemagick.org/command-line-options/#fill)", mas também pode especificar uma "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)", além de uma cor de borda ou "[-stroke](https://imagemagick.org/command-line-options/#stroke)", ambas desativadas por padrão (definidas com a cor 'none'). A cor "[-fill](https://imagemagick.org/command-line-options/#fill)" também pode ser substituída por um padrão de imagem "[-tile](https://imagemagick.org/command-line-options/#tile)", enquanto a largura da borda do traço pode ser alterada usando "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)". Então a posição relativa do texto desenhado pode ser alterada com uma configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Por exemplo, aqui usei muitos dos recursos extras que acabei de mencionar.

  magick -size 320x100 xc:lightblue  -font Candice -pointsize 72 \
          -tile bg.gif  -undercolor dodgerblue  -stroke navy  -strokewidth 2 \
          -gravity center  -draw "text 0,0 'Anthony'" text_options.gif

[IM Output]

| _A partir da versão 6.2.4 do IM, a operação "[-draw](https://imagemagick.org/command-line-options/#draw) text" não compreende mais o uso de '\n' como significando quebra de linha, nem o uso de escapes de informação de imagem por porcentagem '%'. (Veja Bug de Desenhar uma Porcentagem).

Essas capacidades, e problemas, no entanto, permanecem disponíveis no novo operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" do IM v6. Veja Operador de Desenho de Texto Annotate abaixo._
---|---
Todas as opções acima também podem ser usadas dentro da string "[-draw](https://imagemagick.org/command-line-options/#draw)" (MVG - Magick Vector Graphic). No entanto, se você definir a opção acima dentro do argumento draw, essa opção só se aplicará a essa string MVG draw específica. Além disso, o formato MVG draw pode fazer muito mais, como rotação de texto e 'decoração' de fonte e, claro, você também pode desenhar várias formas como círculos na imagem. Por exemplo, aqui desenhamos texto sublinhado e rotacionado, sobreposto a alguns círculos de fundo.

  magick -size 320x120 xc:lightblue \
          -draw "fill tomato  circle 250,30 310,30 \
                 fill limegreen  circle 55,75 15,80 \
                 font Candice  font-size 72  decorate UnderLine \
                 fill dodgerblue  stroke navy  stroke-width 2 \
                 translate 10,110 rotate -15 text 0,0 ' Anthony '" \
          draw_mvg.gif

[IM Output]

Se você realmente quer fazer o máximo uso de "[-draw](https://imagemagick.org/command-line-options/#draw)" para criar sua imagem, sugiro que dê uma olhada na Página de Exemplos de Desenho.

Caixa de Undercolor

A configuração de cor "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)", como demonstrado acima, e mais adiante abaixo, colorirá a área de desenho definida para esse caractere e fonte. Geralmente, ela apenas se ajusta ao caractere desenhado. Este é particularmente o caso das bordas esquerda e direita da fonte desenhada, já que as bordas superior e inferior são geralmente grandes o suficiente para acomodar todos os caracteres. A área de desenho basicamente representa os limites da 'célula' do caractere que circundam a área em que a fonte é desenhada. O uso principal da opção "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" é como uma maneira simples e rápida de limpar um fundo 'ruidoso' ao redor do texto. Por exemplo, veja Anotando Sobre Imagens. No entanto, recomenda-se que você também adicione um caractere de espaço extra no início e no final da string que está sendo desenhada nesse caso.

Transbordamento da Caixa Delimitadora

Um dos maiores problemas que você provavelmente encontrará ao desenhar texto, ou simplesmente ao manipular fontes em geral, é que nem todas as fontes obedecem às regras normais. Um designer de fontes pode 'desenhar' caracteres individuais (ou 'glifos') em qualquer lugar relativo à posição atual do texto (conhecida como cursor, ou caret). A posição da fonte nem precisa avançar, e em algumas fontes internacionais poderia até retroceder!. O resultado dessa liberdade de design é que alguns 'glifos' não cabem dentro da área de desenho definida na qual a fonte declara que o caractere se encaixa, especialmente em fontes inclinadas, ou parecidas com escrita à mão, onde algumas partes das letras se estendem bem para fora dos limites e para as áreas usadas por caracteres posteriores (ou anteriores). A pior fonte que já vi a esse respeito é a fonte 'LokiCola', que desenha cerca de metade de suas letras maiúsculas com longas caudas onduladas, bem além dos limites das células de caractere individuais. A fonte basicamente assume que cada letra maiúscula será seguida por 3 ou mais letras minúsculas. Para mostrar isso, vou desenhar separadamente várias das letras maiúsculas da fonte, permitindo que você veja exatamente o quão longe as letras poderiam se estender além dos limites de 'undercolor' ou de desenho da célula. Eu também uso algumas delas para formar o nome da fonte, para que você possa ver exatamente como elas foram projetadas para serem usadas, e por que transbordam suas caixas delimitadoras.

  magick -size 500x200  xc:lightblue \
          -font LokiCola  -pointsize 72  -undercolor dodgerblue \
          -draw "text  15,65 'L'"   -draw "text 130,65 'C'" \
          -draw "text 245,65 '1'"   -draw "text 360,65 'H'" \
          -gravity South -draw "text 0,10 'Loki Cola'"    draw_undercolor.gif

[IM Output]

Observe também como o 'H' na verdade transborda tanto no lado esquerdo quanto no lado direito de sua área de desenho. Isso pode dificultar seu uso no início das linhas. Lembre-se de que este problema NÃO é um bug no IM, mas é causado pela interação da biblioteca de fontes que o IM usa, e das configurações dentro da própria fonte, geralmente de propósito pelo designer da fonte. O IM apenas usa os resultados conforme são programados na fonte, o que nem sempre produz o que o usuário pretendia. Recomenda-se, portanto, cautela com fontes incomuns.

Annotate - Operador de Desenho de Texto

Com a versão 6 do IM, um novo operador de desenho de fonte, "[-annotate](https://imagemagick.org/command-line-options/#annotate)", foi disponibilizado. Este operador é, de muitas maneiras, muito mais simples do que usar uma operação "[-draw](https://imagemagick.org/command-line-options/#draw) text", mas, como ele usa a API 'annotate()' (Application Program Interface), ele também é mais poderoso. Embora o operador faça uso das primitivas "[-draw](https://imagemagick.org/command-line-options/#draw)", ele o faz de uma forma mais complexa, como expandir caracteres de escape especiais para adicionar informação extra de imagem e até múltiplas linhas, e aplicar uma transformação do sistema de coordenadas ao texto desenhado para produzir inclinações e rotações. Por causa disso, o operador é agora o operador de desenho de texto preferido para todo o desenho de texto e anotação de imagem do ImageMagick, e isso agora está refletido nestas páginas de exemplo. Aqui está um exemplo básico usando este operador.

  magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
          -fill blue  -annotate +25+70 'Anthony'    annotate.gif

[IM Output]

Um dos recursos extras do operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" é que ele pode rotacionar os eixos X e Y do texto desenhado completamente separados um do outro. Isso é feito fornecendo o ângulo em que rotacionar cada eixo como um 'tamanho de imagem' no argumento do operador. Apenas para mostrar quão complexa uma única operação "[-annotate](https://imagemagick.org/command-line-options/#annotate)" pode ser, aqui está uma imagem em caixa, com traço, e inclinada...

  magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
          -tile bg.gif  -undercolor dodgerblue   -stroke navy -strokewidth 2 \
          -annotate 0x20+20+67 'Anthony' annotate_opts.gif

[IM Output]

Neste exemplo, todos os quatro argumentos do annotate são fornecidos: rotação do eixo X, rotação do eixo Y, e a posição X e Y da fonte na imagem de fundo. Observe também que o padrão de preenchimento (definido com "[-tile](https://imagemagick.org/command-line-options/#tile)") também é inclinado junto com a fonte. Isso porque ele é desenhado usando um sistema de coordenadas cisalhado/rotacionado, que também cisalha o padrão de preenchimento ladrilhado dentro do texto desenhado. Um exemplo adicional dessa capacidade de cisalhamento é o exemplo Fonte com Sombra Cisalhada. Compare isso com a Fonte Inclinada criada com a string MVG "[-draw](https://imagemagick.org/command-line-options/#draw)" equivalente. Para uma tabela resumindo os efeitos da operação de cisalhamento do "[-annotate](https://imagemagick.org/command-line-options/#annotate)", veja Uso do Argumento Annotate. Por exemplo, aqui está um texto levemente rotacionado...

  magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
          -annotate 350x350+20+90 'Anthony' annotate_rotated.gif

[IM Output]

| Observe que o ângulo fornecido ao "[-annotate](https://imagemagick.org/command-line-options/#annotate)" deve ser positivo para o IM entendê-lo corretamente). A exceção a isso é se uma forma de Argumento de Geometria com 4 números separados por vírgula for usada. Por exemplo, "-annotate '-10,-10,20,90' 'Anthony'", poderia ter sido usado no último exemplo.
---|---
Isso pode ser usado para gerar rotulagem condensada em ângulo. Por exemplo... |

  magick -size 100x60 xc:skyblue \
          -annotate 300x300+20+50 "First" \
          -annotate 300x300+35+50 "Second" \
          -annotate 300x300+50+50 "Third" \
          -annotate 300x300+65+50 "Fourth" \
          -annotate 300x300+80+50 "Fifth" \
          annotated_labels.jpg

[IM Output]
Você também pode adicionar outras informações sobre a imagem atual à string anotada usando caracteres de escape. Por exemplo, vamos sobrescrever a imagem "rose:" interna com informações sobre o tamanho da imagem. Para centralizar o texto na imagem, usamos uma configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity)", e desativamos todas e quaisquer rotações e deslocamentos usando um argumento "[-annotate](https://imagemagick.org/command-line-options/#annotate)" de '0'. |

  magick rose: -fill white -stroke black  -font Candice -pointsize 20 \
          -gravity center   -annotate 0 '%wx%h\nPixels'    annotate_rose.gif

[IM Output]
Para mais informações, veja Caracteres de Escape Especiais em Argumentos de Texto abaixo. Para outros exemplos de anotar texto sobre uma imagem maior de várias maneiras (como centralizado na lateral, ou rotacionado no canto inferior direito), veja Exemplos Práticos de Anotação de Texto.

Telas de Texto Anotado Dimensionadas Automaticamente

Frequentemente, você precisa de muito mais controle do que o que "[label:](#label)" pode fornecer. Por exemplo, você quer usar uma imagem de ladrilho ou gradiente, exigindo que você Anote o texto. Infelizmente, você então precisa saber de antemão o tamanho da tela necessária para seu Texto Anotado. Aqui está um exemplo típico do problema. Quando configurei este comando pela primeira vez, defini meu tamanho para os resultados que eu queria, e a princípio funcionou muito bem. Mas então obtive isto...

  magick -size 480x80   gradient:yellow-green \
          -font ArialBkI -pointsize 70 -tile gradient:blue-red \
          -annotate +10+65 'Gradient Fun'    funfont_gradients.jpg

[IM Output]

Infelizmente, ao adivinhar o tamanho da tela, eu havia escrito errado a palavra 'Gradient' acima (faltando a letra 'i'). Claro que, quando corrigi essa ortografia, o tamanho da minha imagem ficou errado, produzindo o resultado incorreto mostrado acima. O que precisamos é poder usar o operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)", mas com a tela dimensionada para caber o Texto Anotado. Uma solução é usar uma tela muito maior, e então usar "[Trim](crop.html#trim)" no fundo para o tamanho certo. Eu também adicionei uma "[Border](crop.html#border)" para acrescentar um pouco de espaço extra ao redor da fonte e da borda final da imagem, para uma aparência melhor.

  magick -size 800x120 xc:black -font Corsiva -pointsize 100 \
          -tile tile_disks.jpg   -annotate +20+80 'Psychedelic!' \
          -trim +repage  -bordercolor black  -border 10   funfont_groovy.jpg

[IM Output]

Este método é muito melhor do que tentar adivinhar quão grande sua imagem final deve ser; no entanto, "[Trim de Tela](crop.html#trim)" não aparará um fundo ladrilhado multicolorido. A melhor solução é criar a tela usando "[label:](#label)", para gerar a tela do tamanho certo. Um Preenchimento de Cor por Draw é então usado para ladrilhar uma imagem sobre a tela (e o texto do rótulo), e finalmente Anotamos nosso texto usando outra imagem de ladrilho.

  magick -font Ravie -pointsize 72  label:'Get Wet!' -border 10 \
          -tile tile_aqua.jpg   -draw "color 0,0 reset"  \
          -tile tile_water.jpg -gravity center -annotate +0+0 'Get Wet!' \
          autosize_wet.jpg

[IM Output]

| Observe que a posição do texto em uma imagem "[label:](#label)" centralizada pode não corresponder exatamente à posição de uma operação "[-annotate](https://imagemagick.org/command-line-options/#annotate)" centralizada. Os dois métodos seguem algoritmos de processamento completamente diferentes, e por isso podem não corresponder, especialmente quando fontes incomuns estão envolvidas.
---|---

Dimensionamento Automático usando 'Caixa de Undercolor'

Em vez de usar uma imagem "[label:](#label)", você pode desenhar a fonte em uma tela grande usando uma Caixa de Undercolor e uma largura de traço grande, antes de aparar a tela para caber. Por exemplo

  magick -size 500x100 xc:lightblue -font SheerBeauty -pointsize 72 \
     -gravity center -undercolor white -stroke none -strokewidth 3 \
     -annotate +0+0 ' Invitation ' -trim +repage -shave 1x1 \
     invitation_box.jpg

[IM Output]

A quantidade de espaço ao redor da fonte pode ser ajustada usando a configuração "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)". O único requisito importante é que a tela inicial seja de uma cor diferente da cor de fundo ('lightblue' neste caso) e seja maior que o resultado final. Apenas uma palavra de aviso: algumas fontes desenham caracteres bem fora da área de desenho individual do caractere. (Por exemplo, veja Caixa de Undercolor acima). Neste caso, o resultado acima funcionará, mas pode exigir que você use uma tela transparente, e então sobreponha o resultado sobre branco (usando uma operação como "-background white -flatten", por exemplo), para transformar as áreas não utilizadas e ainda transparentes em branco. No entanto, esse caractere provavelmente estará tocando uma borda da imagem resultante. Basicamente, você não consegue vencer em todas as situações, então apenas faça o seu melhor.

Colorindo uma Imagem de Texto em Escala de Cinza

Eu propositalmente gerei a imagem acima como uma imagem em escala de cinza, preto e branco, pois isso pode ser usado como um modelo de máscara. A partir de uma imagem pura como esta, você pode então colorir o fundo e o primeiro plano da imagem, seja separadamente ou ambos ao mesmo tempo. Aqui, por exemplo, uso o Operador Level por Cores, "[+level-color](https://imagemagick.org/command-line-options/#level-color)", para modificar globalmente as cores da imagem de modo a atribuir as cores de primeiro plano e de fundo com valores específicos.

  magick invitation_box.jpg -colorspace sRGB \
          +level-colors navy,lightblue invitation_colored.jpg

[IM Output]

Por exemplo, aqui uso Mascaramento por Composição para substituir o fundo e o primeiro plano por imagens de padrão.

  magick invitation_box.jpg -colorspace sRGB \
          \( +clone -size 300x150 -tile gradient:LightYellow \
                                             -draw "color 0,0 reset" \) \
          \( +clone -size 300x150 -tile plasma:tomato \
                                             -draw "color 0,0 reset" \) \
          -reverse  -composite      invitation_rose.jpg

[IM Output]

O Operador Reverse no exemplo acima é usado para reordenar as imagens, de modo que a primeira imagem se torne a terceira imagem de 'mascaramento' da composição. A imagem de primeiro plano ("plasma:") torna-se então a primeira, e o fundo fica no meio. Para outras técnicas de colorir uma imagem em escala de cinza como esta, veja Usando uma Máscara para Limitar a Área Composta. De forma mais geral, veja Usando Máscaras com Imagens. Para outros métodos de gerar gradientes para ladrilhar, veja Gradientes de Cor, Pontos Esparsos de Cor, e Telas Aleatórias.


Fontes

Em Construção

Quanto à ordenação dos caminhos de fontes, isso é simplesmente ordenar as fontes especificadas nos
arquivos XML.

O ponto de partida são as fontes do sistema, seguidas pelo arquivo "type.xml"
instalado pelo sistema; no meu sistema, este é "/etc/ImageMagick-6/type.xml".

Este arquivo "type.xml" instalado pelo sistema é tipicamente apenas uma lista de 'inclusões' (include)
de outros arquivos type-*.  E a ordem das inclusões especificará a ordem das
Fontes Extras do Sistema, versus as Fontes do Ghostscript.

Depois desse arquivo, outros arquivos "type.xml" são procurados, como nos diretórios 'home',
ou até no diretório atual.

Fontes posteriores NÃO substituirão fontes anteriores; por isso, se duas fontes tiverem o
mesmo nome, apenas a primeira será notada pelo IM. (uma medida de segurança).

Para ver as fontes carregadas, use
    magick -list font

Ela lista o "Path:" do arquivo type em que cada lista de fontes foi encontrada, mas os
caminhos são listados em ordem INVERSA, com as fontes do sistema no final.

Eu tenho, por exemplo, uma fonte pessoal chamada "Courier", mas ela não está listada na
lista acima, pois foi definida depois da "Courier" que foi encontrada na
área de "Fontes do Sistema" (que está listada no final da saída acima).

Por outro lado, minha própria fonte pessoal "CourierNew" está listada, pois não
entra em conflito com nenhuma fonte do sistema ou definida pela configuração do sistema.

Para ver qual arquivo de glifos de fonte é selecionado para alguma solicitação específica,
use...
  magick -debug annotate xc: -font Courier \
          -annotate 0 'Test' null: 2>&1 |
    grep '^ *Font '

Determinando Métricas de Fonte, sem usar uma API

[diagram] Uma fonte específica e seus caracteres individuais contêm muita informação. Tal informação pode ser muito útil de se ter, especialmente se você está querendo usar o IM para juntar o texto de muitas fontes diferentes. Também é importante lembrar que a maioria das fontes são fontes proporcionais, o que significa que cada caractere individual terá uma largura diferente, e um 'avanço natural' diferente do cursor (ou origem). Por isso, cada 'string' específica de caracteres será renderizada (desenhada) com um comprimento diferente, sem qualquer consideração real pelo número real de caracteres usados na string. A exceção a isso são as fontes de 'Largura Fixa', como as fontes "Courier", "Typewriter" ou "Terminal", nas quais todos os caracteres têm a mesma largura, permitindo que você gere colunas de texto facilmente. A Configuração de Depuração "[-debug](https://imagemagick.org/command-line-options/#debug) annotate" pode ser usada para fazer o IM relatar diretamente as métricas de uma fonte TTF, para uma string específica. Por exemplo...

  magick -debug annotate  xc: -font Candice -pointsize 24 \
          -annotate 0 'Test' null: 2>&1 |\
    grep Metrics: | fmt -w80

[IM Text]

Como você pode ver, você obtém um conjunto variado de informações que pode usar: desde os limites declarados da string desenhada (que não são necessariamente os limites reais da string), em relação à origem; até a quantidade que o 'cursor' (origem) deve avançar antes de desenhar a próxima string. A saída de depuração completa (que é bastante verbosa, e não mostrada acima) também relata o arquivo de fonte realmente usado (duas vezes), então você também pode usá-la para verificar se tem a fonte certa. O método "[-debug](https://imagemagick.org/command-line-options/#debug) annotate" foi adicionado ao IM v6.3.9-2

Técnicas Mais Antigas

Esta saída de depuração, porém, pode não ser conveniente, ou você pode ter que lidar com IMs mais antigos que esta versão. Os exemplos a seguir são exemplos mais antigos, em que o texto é realmente desenhado de várias maneiras e cores, e então a informação (como inteiros) é extraída da imagem resultante. Por exemplo, vamos descobrir as dimensões da fonte 'Ravie' em relação a uma linha de base fixa, a 72 pontos. Aqui está a imagem que estudaremos, como referência. Você não precisa, na verdade, desenhá-la e salvá-la como imagem, pois estamos apenas extraindo dados, não uma imagem. as cores desta imagem serão modificadas para que possamos examinar as partes brancas e pretas separadamente usando "[-trim](https://imagemagick.org/command-line-options/#trim)" para extrair as métricas usadas. |

  magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
          -fill black -undercolor white  -annotate +20+100 'A' font_drawn.gif

[IM Output]
Para as métricas básicas da fonte, primeiro desenhamos a própria fonte com uma cor transparente ('None'), de modo que possamos medir e encontrar o tamanho e a localização da caixa delimitadora ou área de desenho desse caractere específico, para esta fonte. Observe que, para informações de altura, você pode simplesmente desenhar qualquer coisa.

  magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
          -fill none -undercolor white  -annotate +20+100 'A' -trim  info:

[IM Text]

A partir dos resultados acima, podemos ver que uma fonte 'Ravie' a 72 pontos terá uma altura total de caixa delimitadora de 74 pixels. O topo da caixa fica a 42 pixels do topo da imagem; como a linha de base foi posicionada na coordenada y de 100 pixels, a caixa começa a 100 - 42 ou 58 pixels acima da linha de base. Isso deixa 74 - 58 ou 16 pixels para a caixa delimitadora abaixo da linha de base para os descendentes. Observe que nem todas as fontes limitam seu desenho dentro de sua caixa delimitadora de desenho definida! No entanto, algumas letras podem se estender bem para fora desses limites. É por isso que o exemplo acima define uma cor "[-fill](https://imagemagick.org/command-line-options/#fill)" de 'none'. Dessa forma, fontes mal comportadas não afetarão as medições acima.
Observe também que a distância que separa as linhas (as linhas de base, na verdade) deve ser determinada puramente pelo tamanho de ponto da fonte, e não tem nada a ver com como a fonte é desenhada. No nosso exemplo, como a fonte tem um tamanho de ponto de 72 pontos, e um ponto é definido como 1/72 de polegada, então as linhas de base devem estar a 1 polegada de distância. Com uma resolução de saída (densidade) atual de 72 pixels por polegada, isso significa que as linhas de base estarão a 72 pixels de distância. Curiosamente, isso significa que, para esta fonte, com uma caixa delimitadora de 74 pixels, a fonte tem uma sobreposição de dois pixels na área de desenho entre as linhas de texto com espaçamento simples adequado! Também a partir das medições acima, podemos ver que, ao desenhar a string "A" nesta fonte com este tamanho de ponto, o próximo caractere deve ser desenhado 66 pixels à direita do ponto de partida (conhecido como cursor). Este é o comprimento 'lógico' da string. Ou seja, o 'cursor', ou ponto de partida para o próximo caractere, deve começar em 20 + 66, ou em '+86+100' (a linha de base não muda verticalmente). Fique avisado de que algumas fontes árabes podem, de fato, desenhar da direita para a esquerda, então o deslocamento do 'cursor' será negativo. Isso nos dá as métricas de fonte para o caractere 'A', mas e quanto às dimensões físicas do 'A' desenhado em relação ao 'cursor' ou ponto de partida. Bem, basta trocar as duas configurações de cor...
  magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
          -fill black -undercolor none  -annotate +20+100 'A'  -trim   info:

[IM Text]

Em termos de altura, o caractere ficou dentro de seus limites de desenho definidos, com sua altura indo de 100 - 43 ou 57 pixels acima da linha de base (encostado em sua caixa delimitadora) a 60 - 57 ou apenas 3 pixels abaixo da linha de base da fonte. Em outras palavras, esta letra não tem um 'descendente' desenhado na área abaixo da linha de base. A partir disso, podemos ver que o 'A' é desenhado de 3 pixels antes do cursor (posicionado em +20, mas a imagem final fica em +17), a 70 - 3 ou 67 pixels após a posição do cursor. Em outras palavras, esta fonte é ligeiramente mais larga do que sua caixa delimitadora horizontal, quando desenhada. Observe que, embora isso lhe dê o comprimento real da string desenhada, isso é diferente do deslocamento do cursor necessário ao anexar texto, (que é definido pela caixa delimitadora da string, e não por seu comprimento desenhado). Em outras palavras, o texto deve ser anexado usando suas caixas delimitadoras, e não o tamanho de seu comprimento realmente desenhado, como fizemos em outros exemplos. Claro que, se você obtém uma fonte muito mal comportada, você pode querer verificar quão longe uma string específica é desenhada além de seus limites, para que você ainda possa fornecer espaço para ela, digamos, no final de uma linha. As dimensões extraídas de uma fonte também variarão com a "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" atual usada para desenhar a fonte. Se você aumentar o tamanho do traço de contorno, então as dimensões (e o tamanho da caixa delimitadora) necessárias para desenhar a fonte também são expandidas na mesma quantidade para acomodar o contorno mais grosso.
As dimensões também variam com o sistema operacional, (tipo e versão) e com a versão da biblioteca de desenho de fontes delegada que o IM está usando nesse sistema, mesmo quando a exata mesma biblioteca de fontes e versão do IM não mudaram. Recomenda-se cautela quando computadores diferentes puderem ser usados para o desenho de texto, pois os resultados podem variar até mesmo para a mesma fonte.
--- ---
Para mais informações, veja o documento TrueType Fundamentals (PDF). Isso mostra que até mesmo minhas generalizações acima podem nem sempre ser verdadeiras, embora geralmente sejam o caso. Observe que os exemplos acima só retornarão dimensões em pixels inteiros, enquanto todas as dimensões usadas pelas fontes são números de ponto flutuante. De fato, se uma fonte é desenhada a partir de um ponto de partida (cursor) de pixel inteiro pode ser dependente da aplicação, e afetar a aparência resultante da fonte.

Criando Linhas com Estilos de Fonte Misturados

Criar uma única linha usando múltiplas fontes, tamanhos de ponto e estilos não é algo que o IM foi realmente projetado para fazer. Fica ainda pior quando você também começa a considerar coisas como justificação de texto, quebra de linha por palavras, e quebra ao redor de imagens e outras coisas. Este é o tipo de coisa que programas como Processadores de Texto, Navegadores Web, Impressoras de Documentos fazem muito bem, geralmente sob interação do usuário, mas poucos conseguem fazê-lo tão bem sob controle de programa. Uma exceção a isso é o "TeX", e sua família de programas (veja Um Sistema Completo de Processamento de Texto abaixo), então, se você é sério sobre processar texto graficamente, sugiro que dê uma olhada nessa família de programas. Outra alternativa é olhar para vários programas de impressão 'bonita' (pretty) de documentos, como um conversor de HTML. Você pode usá-los para transformar documentos gerados por programas em postscript, que o IM pode então felizmente pós-processar em qualquer formato ou estilo de imagem que você quiser. Uma solução por API (usando a interface da API C MagickWand) foi criada por "El Supremo" (dos fóruns de discussão do IM) em seu programa FontMetrics. e aqui está um Exemplo de Saída do "FontMetrics".
Agora, embora a linha de comando do IM não seja projetada para 'processamento de texto', isso não significa que você não pode usá-la para tal. Apenas é mais difícil. Aqui darei alguns exemplos de misturar texto em fontes e estilos diferentes, para dar às pessoas um ponto de partida. A solução mais simples que as pessoas geralmente pensam é apenas anexar imagens "[label:](fonts.html#label)" juntas...

  magick -font LokiCola     -pointsize 36  label:'LokiCola ' \
          -font Candice      -pointsize 24  label:'Candice ' \
          -font SheerBeauty  -pointsize 48  label:'SheerBeauty' \
          +append   wp_label_append.jpg

[IM Output]

No entanto, como você pode ver, todas as imagens estão alinhadas verticalmente ao topo da imagem e, a menos que você use fontes semelhantes, não ficará muito bom. Alternativamente, você pode usar um truque de justificação de anexação para alinhá-las ao longo da parte inferior.

  magick -size 1x50 xc:none +size \
          \( -background white -font LokiCola -pointsize 36 \
             label:'LokiCola ' \
             -clone 0 +swap  -background none -append \) \
          \( -background white -font Candice  -pointsize 24 \
             label:'Candice ' \
             -clone 0 +swap  -background none -append \) \
          \( -background white -font SheerBeauty  -pointsize 48 \
             label:'SheerBeauty' \
             -clone 0 +swap  -background none -append \) \
          -delete 0   -gravity South -crop 0x50+0+0   +append \
          -bordercolor none  -border 1 -trim  +repage \
          -background white -flatten    wp_label_bottom.jpg

[IM Output]

O que isto fez foi adicionar algum preenchimento extra ao topo de cada rótulo, e recortar todos eles à mesma altura antes de anexá-los horizontalmente. Depois disso, um simples "[-trim](https://imagemagick.org/command-line-options/#trim)" e um "[-flatten](https://imagemagick.org/command-line-options/#flatten)" foram usados para definir a altura da linha como a do rótulo mais alto, e preencher o fundo. Como você pode ver, isso produz um trabalho melhor, mas uma fonte pequena tende a produzir um comportamento parecido com subscrito, em vez de texto adequadamente alinhado. O que realmente precisamos fazer é alinhar todas as strings de texto por suas 'linhas de base', e isso é muito difícil sem acesso a mais informações textuais. Esta informação é facilmente obtível sob uma API de programa, mas muito mais difícil a partir da linha de comando. Um método é mostrado na seção de exemplo anterior. No entanto, é possível alinhar palavras por sua linha de base sem realmente coletar informação de linha de base. Embora as imagens de texto "[label:](fonts.html#label)" não forneçam nenhuma pista quanto à linha de base das imagens, você pode especificamente desenhar imagens em uma linha de base fixa. Sem uma API, você também não pode descobrir diretamente quão longo ou alto o texto desenhado é, então você precisa primeiro usar uma tela grande o suficiente para garantir que não percamos nenhuma informação sobre a imagem de texto. Então, para preservar os espaços finais e a altura do texto, você também tem que fazer bom uso do recurso ("[-undercolor](https://imagemagick.org/command-line-options/#undercolor)") disponível para anotação de texto, e fornecer um limite para o aparo da imagem. Então, vamos ver como você pode fazer isso a partir da linha de comando.

  magick -size 500x100 xc:none  -fill blue  -draw 'line 15,0 15,99' \
          -undercolor white -fill black \
          \( -clone 0   -font LokiCola    -pointsize 36 \
             -annotate +5+60 'Loki Cola ' \) \
          \( -clone 0   -font Candice     -pointsize 24 \
             -annotate +5+60 'Candice ' \) \
          \( -clone 0   -font SheerBeauty -pointsize 48 \
             -annotate +5+60 'Sheer Beauty' \) \
          -delete 0 -trim +repage  +append \
          -transparent blue  -trim +repage \
          -background white -flatten   wp_draw_baseline.jpg

[IM Output]

Como antes, o aparo das imagens é feito em duas etapas. Primeiro, desenhamos o texto sobre uma imagem base que contém uma linha vertical azul. Assim, quando aparamos o texto, apenas a largura da imagem de texto será aparada, deixando todas as palavras na mesma altura de linha de base. Depois de anexá-las juntas, podemos agora remover a linha de construção azul tornando-a totalmente transparente. Se você está gerando apenas uma imagem em preto e branco, a melhor maneira seria apenas extrair um dos canais não azuis, o que garante que você realmente obtenha toda a linha de construção. Um segundo aparo então aparará as seções superior e inferior, encolhendo-a até a maior caixa delimitadora. Um achatamento (flatten) final na mesma cor da caixa delimitadora então remove todo vestígio de seu uso na construção da linha. Como você pode ver, todo o texto está agora adequadamente alinhado pela linha de base, independentemente da fonte ou do tamanho de ponto usado. Claro que, nestes exemplos, usei apenas texto preto sobre branco. Outras cores podem ser usadas, contanto que não interfiram na linha de construção e no fundo transparente usados para o alinhamento do texto. Com esta técnica, você pode agora gerar linhas de texto com fontes misturadas, e anexá-las todas verticalmente em um documento maior. Você também pode ver que fazer tudo isso dá muito trabalho, trabalho que normalmente é ocultado do usuário por processadores de texto e navegadores web. Se você planeja fazer muito desse tipo de coisa, sugiro que dê uma olhada nas alternativas que mencionei anteriormente.


Preenchimento de Formulário

Você tem uma imagem de algum formulário de preenchimento padrão e quer preencher os campos que estão em posições bem conhecidas. Então você tem um arquivo de dados como "[text_data.txt](../static/img/images/text_data.txt)" mostrado aqui...

[IM Text]

Os campos são: largura do texto, gravidade (justificação), cor, posição x, y e o texto real a ser colocado para este campo. Agora você pode usar um simples script de shell em loop para gerar um rótulo de texto conforme descrito acima, atribuindo o texto apropriado nas posições de texto definidas em uma imagem de formulário (fundo).

  cat text_data.txt |
  while read width gravity color  pointsize x y text
  do
    magick -size ${width}x -gravity $gravity -fill $color -background wheat \
                -pointsize $pointsize  -page +${x}+${y}  label:"${text}"  miff:-
  done |
    magick -size 200x100 xc:   -   -flatten    text_layered.jpg

[IM Output]

A 'imagem de formulário' neste caso é apenas uma imagem em branco, mas na verdade poderia ser qualquer coisa. Eu também defini a cor de fundo dos rótulos como 'wheat' para que a área preenchida fique visível, mas você normalmente definiria isso como none. O exemplo acima não usa arquivos temporários, mas em vez disso usa um pipeline de imagens em formato MIFF. Este é um exemplo de uso de um Formato de Streaming de Imagem, no qual imagens individuais são simplesmente anexadas juntas, uma após a outra, em um arquivo ou pipeline. Este é apenas um ponto de partida. Os campos do formulário podem vir de algum arquivo de definição, enquanto o texto a preencher pode vir de um banco de dados ou outra fonte de dados. Outros atributos também podem ser definidos, como a fonte a usar, rotações de texto, e assim por diante. Você também poderia incluir tanto largura quanto altura, ou, se o texto deve ser quebrado por palavras, Caption deveria ser usado em vez de um Label. Veja também Alfinetes em um Mapa para outro exemplo desta técnica, muito parecida com a acima.


Alternativas de Processamento de Texto

A maneira ideal de gerar arquivos de texto e documentos totalmente formatados é usar o ImageMagick como parte de um sistema maior de processamento de imagem e texto. Ferramenta usada para...
ImageMagick Processamento e preparações de imagem em lote
Gimp Edição de imagem por GUI para correções de problemas pontuais
LyX Processamento de texto por GUI, feito para gerar...
LaTeX Processador de texto para documentos, e livros...
TeX Formato de Texto Subjacente
(posiciona símbolos e fontes nas páginas)
Metafont Gerador de Fontes do TeX
Basicamente, o ImageMagick pode fazer muitas coisas, mas isso não significa que ele é a melhor ferramenta para essas coisas. Para preparações de documentos maiores, é melhor você tratá-lo como apenas uma parte de um todo maior. As várias ferramentas 'TeX' apresentadas acima geralmente vêm como instalação padrão na maioria dos sistemas Linux, e podem combinar texto e imagens em um todo unificado. Mais importante, ela mantém o texto como texto, e formata o texto apropriadamente, conforme você especifica, fazendo quase todo o trabalho pesado de quebra de palavras e páginas, e organização com as imagens. Mas sem encher um arquivo 'doc' com lixo de formatação inútil. Você tem controle total, ou pode deixá-lo tomar as decisões. Elas fornecem uma maneira de gerar qualquer tipo de documento, desde uma página simples, boletim informativo ou até um livro completo. Se você é sério sobre geração de documentos, então essas ferramentas valem muito a pena olhar e aprender.
O Pango (apenas Linux e MacOSX) também fornece uma alternativa. Ele fornece muitos recursos de processamento de texto para imagem que não estão disponíveis no ImageMagick. Por exemplo, TABs, justificação, margens, cabeçalhos, e assim por diante. Ele até tem uma linguagem de marcação de algum tipo para permitir mudanças de fonte no meio do texto.
Outras soluções também incluem os muitos programas de conversão de texto para postscript, como "a2ps", que demonstro ao gerar um arquivo postscript de exemplo em Manipulação de Postscript acima. Isso converte e formata muitos tipos diferentes de arquivos de texto, com quebra de linha por palavras, negrito e controle de tabulação, além de um cabeçalho, rodapé, borda razoavelmente bons, e opções de múltiplas páginas. Claro que isto é processamento de imagem indireto via uma linguagem intermediária Postscript ou PDF. Outra é dispor o texto usando SVG, ou o Comando de Desenho do ImageMagick, embora você então precise lidar com o layout. Há muitas ferramentas por aí para transformar texto em imagens, com a magia delas, e a maioria pode ser combinada com o ImageMagick para pós-processar a imagem de texto e mesclá-la em sua imagem. Isso permite que o ImageMagick siga fazendo o que faz de melhor, processamento de imagem.