⚠️ 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://imagemagick.org/script/command-line-processing.php).

A Anatomia da Linha de Comando

A Anatomia da Linha de Comando • Nome do Arquivo de Entrada • Opções da Linha de Comando • Nome do Arquivo de Saída

As ferramentas de linha de comando do ImageMagick podem ser tão simples quanto isto:

magick image.jpg image.png

Ou podem ser complexas, com uma infinidade de opções, como no exemplo a seguir:

magick label.gif -alpha Set \
  \( +clone  -shade 110x90 -normalize -negate +clone  -compose Plus -composite \) \
  \( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -alpha Off \) \
  -delete 0 +swap  -compose Multiply -composite  button.gif

Este comando de exemplo é longo o suficiente para precisar ser escrito em várias linhas, então o formatamos para maior clareza inserindo barras invertidas (). A barra invertida é o caractere de continuação de linha do Linux. No shell do Windows, use o caractere acento circunflexo (^) para a continuação de linha. Nestas páginas web usamos o estilo do Linux, como acima. Às vezes, porém, as linhas são quebradas pelo seu navegador se a janela for pequena o bastante, mas as linhas de comando, exibidas em branco, ainda devem ser digitadas como uma única linha. Os caracteres de continuação de linha não precisam ser digitados. Os parênteses que aparecem escapados acima usando a barra invertida não são escapados no Windows. Há algumas outras diferenças entre Windows e Linux (envolvendo aspas, por exemplo), mas discutiremos algumas dessas questões mais adiante, à medida que surgirem.

Para a maioria dos exemplos de linha de comando neste site, se houver uma tradução equivalente para executar no Windows, haverá um menu suspenso no canto inferior direito, permitindo alternar para qual sistema operacional você está visualizando o comando.

Mesmo sem saber muito sobre a linha de comando do ImageMagick, você provavelmente consegue deduzir que o primeiro comando acima converte uma imagem no formato JPEG para uma no formato PNG. No entanto, muito poucos perceberão que o segundo comando, mais complexo, dá a um rótulo plano e bidimensional uma aparência tridimensional, com texturas ricas e profundidade simulada:

label ==> button

Aqui mostramos o percentual de conclusão de uma tarefa como um cilindro sombreado:

Shaded Cylinder

Dada a complexidade da renderização, você pode se surpreender que ela seja realizada por uma única linha de comando:

magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
  -draw 'roundrectangle 264, 5, 304, 85  20,40' -tile gradient:chartreuse-green \
  -draw 'roundrectangle 16,  5, 180, 85  20,40' -tile gradient:chartreuse1-chartreuse3 \
  -draw 'roundrectangle 140, 5, 180, 85  20,40' +tile -fill none \
  -draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
  -strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
  -append -background white -gravity center -extent 320x200 cylinder_shaded.png

Execute este script contribuído por Geemack. Você terá um vislumbre do poder e da versatilidade da linha de comando do ImageMagick:

magick -background none -size 960x960 xc:black \( xc:darkred -duplicate 1 +append \) \
  xc:gold \( xc:teal -duplicate 2 +append \) -modulate 100,100,"%[fx:rand()*200]" \
  xc:white -scale x1 +append -write mpr:clut +delete radial-gradient: mpr:clut \
  -clut -scale 100x4% -wave "%[fx:rand()*24+24]"x"%[fx:w/ceil(rand()*4+1)]" -extent "%[w]x%[w]" \
  -roll +0+"%[fx:(rand()*w*0.05)+(w*0.51)]" \( +clone -blur 0x4 \) -insert 0 -composite \
  -duplicate "%[fx:floor(rand()*3+3)*2-1]" -set option:rot "%[fx:180/n]" -virtual-pixel tile \
  -virtual-pixel none -distort SRT "%[fx:t*360/n]" +repage -flatten -extent 100x50% \
  \( +clone -rotate 180 \) -append +channel -virtual-pixel none -distort SRT "0.96 %[fx:rand()*360]" \
  \( +clone -flop \) +repage -insert "%[fx:round(rand())]" -background black \
  -flatten -brightness-contrast 20,20 -normalize dragonFire.png

Para garantir que o script possa ser executado no Windows, troque quaisquer parênteses com barra invertida (\() por apenas parênteses, a barra invertida (\) por ^, e duplique os sinais de porcentagem (%).

Nas próximas seções, dissecamos a anatomia da linha de comando do ImageMagick. Esperamos que, depois de ler com atenção e compreender melhor como a linha de comando funciona, você seja capaz de realizar tarefas complexas de processamento de imagens sem recorrer às interfaces de programação, às vezes intimidadoras.

Consulte Examples of ImageMagick Usage para obter ajuda adicional ao usar o ImageMagick a partir da linha de comando.

A Anatomia da Linha de Comando

A linha de comando do ImageMagick é composta por

  • um ou mais nomes de arquivos de entrada obrigatórios.
  • zero, uma ou mais configurações de imagem (image settings).
  • zero, um ou mais operadores de imagem (image operators).
  • zero, um ou mais operadores de sequência de imagens (image sequence operators).
  • zero, uma ou mais pilhas de imagens (image stacks).
  • zero ou um nome de arquivo de imagem de saída (obrigatório para magick, convert, composite, montage, compare, import, conjure).

Você encontrará uma explicação detalhada de cada uma das partes constituintes da linha de comando nas seções a seguir.

Nome do Arquivo de Entrada

O ImageMagick estende o conceito de nome de arquivo de entrada para incluir:

  • globbing de nomes de arquivo
  • um formato de imagem explícito
  • uso de imagens e padrões embutidos
  • STDIN, STDOUT e descritores de arquivo
  • seleção de determinados quadros de uma imagem
  • seleção de uma região de uma imagem
  • forçar um redimensionamento de imagem em linha
  • forçar um recorte de imagem em linha
  • uso de referências de nomes de arquivo

Essas extensões são explicadas nos próximos parágrafos.

Observe que, por padrão, se uma opção da linha de comando também for um nome de arquivo (por exemplo, -quality), ela é interpretada como um nome de arquivo. Use -define registry:option:pedantic=true para, em vez disso, interpretá-la como uma opção.

Globbing de Nomes de Arquivo

Nos shells do Linux, certos caracteres como o asterisco (*) e o ponto de interrogação (?) fazem com que listas de nomes de arquivo sejam geradas automagicamente com base em correspondências de padrões. Esse recurso é conhecido como globbing. O ImageMagick oferece suporte ao globbing de nomes de arquivo para sistemas, como o Windows, que não o suportam nativamente. Por exemplo, suponha que você queira converter 1.jpg, 2.jpg, 3.jpg, 4.jpg e 5.jpg no seu diretório atual em uma animação GIF. Você pode se referir convenientemente a todos os arquivos JPEG com este comando:

magick *.jpg images.gif

Formato de Imagem Explícito

As imagens são armazenadas em uma infinidade de formatos de imagem, incluindo os mais conhecidos JPEG, PNG, TIFF e outros. O ImageMagick precisa conhecer o formato da imagem antes de poder lê-la e processá-la. A maioria dos formatos tem uma assinatura dentro da imagem que identifica unicamente o formato. Na falta dela, o ImageMagick recorre à extensão do nome do arquivo para determinar o formato. Por exemplo, image.jpg ou image.JPG indica ao ImageMagick que ele está lendo uma imagem no formato JPEG.

Em alguns casos, a imagem pode não conter uma assinatura e/ou o nome do arquivo não identifica o formato da imagem. Nesses casos, é preciso especificar um formato de imagem explícito. Por exemplo, suponha que nossa imagem se chame image e contenha valores brutos de intensidade de vermelho, verde e azul. O ImageMagick não tem como determinar automagicamente o formato da imagem, então o definimos explicitamente:

magick -size 640x480 -depth 8 rgb:image image.png

Imagens e Padrões Embutidos

O ImageMagick possui diversas imagens e padrões embutidos. Para utilizar o padrão de tabuleiro de damas (checkerboard), por exemplo, use:

magick -size 640x480 pattern:checkerboard checkerboard.png

STDIN, STDOUT e descritores de arquivo

O Linux e o Windows permitem que a saída de um comando seja canalizada para a entrada de outro. O ImageMagick permite que dados de imagem sejam lidos e escritos a partir dos fluxos padrão STDIN (entrada padrão) e STDOUT (saída padrão), respectivamente, usando um pseudo-nome de arquivo -. Neste exemplo, canalizamos a saída do magick para o programa display:

magick logo: gif:- | magick display gif:-

O segundo formato explícito "gif:" é opcional no exemplo anterior. O formato de imagem GIF tem uma assinatura única dentro da imagem, então o comando display do ImageMagick consegue reconhecer prontamente o formato como GIF. O programa magick também aceita STDIN como entrada dessa forma:

magick rose: gif:- | magick - -resize "200%" bigrose.jpg'

Outros pipes podem ser acessados por meio de seus descritores de arquivo (a partir da versão 6.4.9-3). Os descritores de arquivo 0, 1 e 2 são reservados para os fluxos padrão STDIN, STDOUT e STDERR, respectivamente, mas um pipe associado a um número de descritor de arquivo N>2 pode ser acessado usando o pseudônimo fd:N. (Os pseudônimos fd:0 e fd:1 podem ser usados para STDIN e STDOUT.) O próximo exemplo mostra como anexar dados de imagem canalizados de arquivos com os descritores 3 e 4 e direcionar o resultado para o arquivo com o número de descritor 5.

magick fd:3 fd:4 -append fd:5

Quando necessário, formatos de imagem explícitos podem ser fornecidos como mencionado anteriormente, como no exemplo a seguir.

magick gif:fd:3 jpg:fd:4 -append tif:fd:5

Seleção de Quadros

Alguns formatos de imagem contêm mais de um quadro de imagem. Talvez você queira apenas a primeira imagem, ou a última, ou alguma quantidade de imagens intermediárias. Você pode especificar quais quadros de imagem ler anexando ao nome do arquivo de imagem o intervalo de quadros entre colchetes. Aqui, nossa imagem (um GIF animado) contém mais de um quadro, mas queremos apenas o primeiro:

magick 'images.gif[0]' image.png

Os shells do Linux geralmente interpretam os colchetes, então colocamos o nome do arquivo entre aspas acima. Em um shell de comando do Windows, os colchetes não são interpretados, mas usar aspas não causa problema. No entanto, na maioria dos casos, os papéis das aspas simples e duplas são invertidos em relação ao Linux e ao Windows, então usuários do Windows geralmente devem tentar aspas duplas onde exibimos aspas simples, e vice-versa.

Você pode ler mais de uma imagem de uma sequência com um intervalo de quadros. Por exemplo, você pode extrair os quatro primeiros quadros de uma sequência de imagens:

magick 'images.gif[0-3]' images.mng

O padrão é avançar um quadro por vez, então os quadros 0, 1, 2 e 3 são retornados. Defina o passo como 2 com -define frames:step=2 e, em vez disso, obtemos os quadros 0 e 2.

Por fim, você pode ler mais de uma imagem de uma sequência, fora de ordem. O próximo comando obtém a quarta imagem da sequência, seguida pela terceira e então pela quinta:

magick 'images.gif[3,2,4]' images.mng

Observe que, nos dois últimos comandos, uma única imagem é escrita. A saída, neste caso, em que o tipo de imagem é MNG, é um arquivo de múltiplos quadros, porque o formato MNG suporta vários quadros. Caso o formato de saída fosse JPG, que suporta apenas quadros únicos, a saída seria composta por quadros separados. Mais sobre isso abaixo, na seção sobre o Nome do Arquivo de Saída.

Seleção de uma Região da Imagem

Imagens brutas (raw) são uma sequência de intensidades de cor sem metainformações adicionais, como largura, altura ou assinatura da imagem. Com formatos de imagem brutos, você precisa especificar a largura e a altura da imagem, mas também pode especificar uma região da imagem a ler. Em nosso exemplo, a imagem está no formato RGB bruto de 8 bits e tem 6000 pixels de largura e 4000 pixels de altura. No entanto, queremos apenas uma região de 600 por 400 perto do centro da imagem:

magick -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg

Você pode obter os mesmos resultados com a opção -extract:

magick -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg

Redimensionamento de Imagem em Linha

Às vezes é conveniente redimensionar uma imagem à medida que ela é lida. Suponha que você tenha centenas de imagens JPEG grandes que deseja converter em uma sequência de miniaturas PNG:

magick '*.jpg' -resize 120x120 thumbnail%03d.png

Aqui, todas as imagens são lidas e, em seguida, redimensionadas. É mais rápido e consome menos recursos redimensionar cada imagem à medida que ela é lida:

magick '*.jpg[120x120]' thumbnail%03d.png

Recorte de Imagem em Linha

Às vezes é conveniente recortar uma imagem à medida que ela é lida. Suponha que você tenha centenas de imagens JPEG grandes que deseja converter em uma sequência de miniaturas PNG:

magick '*.jpg' -crop 120x120+10+5 thumbnail%03d.png

Aqui, todas as imagens são lidas e, em seguida, recortadas. É mais rápido e consome menos recursos recortar cada imagem à medida que ela é lida:

magick '*.jpg[120x120+10+5]' thumbnail%03d.png

Referências de Nomes de Arquivo

Há dois métodos para usar um nome de arquivo a fim de referenciar outros nomes de arquivos de imagem. O primeiro é com '@', que lê nomes de arquivos de imagem separados por espaços em branco do arquivo especificado. Suponha que o arquivo myimages.txt consista em uma lista de nomes de arquivo, assim:

frame001.jpg
frame002.jpg
frame003.jpg

Então esperamos que este comando:

magick @myimages.txt mymovie.gif

leia as imagens frame001.jpg, frame002.jpg e frame003.jpg e as converta em uma sequência de imagens GIF.

Se o caminho da imagem incluir um ou mais espaços, coloque o caminho entre aspas:

'my title.jpg'

Algumas opções de linha de comando do ImageMagick podem exceder a capacidade do seu processador de linha de comando. O Windows, por exemplo, limita as linhas de comando a 8192 caracteres. Se, por exemplo, você tiver uma opção draw com pontos de polígono que excedam o limite de comprimento da linha de comando, coloque a opção draw em um arquivo e referencie o arquivo com o @ (por exemplo, @mypoly.txt).

Outro método para se referir a outros arquivos de imagem é incorporar um caractere de formatação no nome do arquivo junto com um intervalo de cenas. Considere o nome de arquivo image-%d.jpg[1-5]. O comando

magick image-%d.jpg[1-5]

faz com que o ImageMagick tente ler imagens com estes nomes de arquivo:

image-1.jpg
image-2.jpg
image-3.jpg
image-4.jpg
image-5.jpg

Buffer de Fluxo

Por padrão, o fluxo de entrada é armazenado em buffer. Para garantir que as informações do arquivo de origem ou do terminal sejam lidas assim que estiverem disponíveis, defina o tamanho do buffer como 0:

magick logo: gif:- | magick display -define stream:buffer-size=0 gif:-

Opções da Linha de Comando

Você pode direcionar o comportamento dos utilitários do ImageMagick com estas opções de linha de comando. O comportamento de uma opção se enquadra em uma destas categorias:

  • Configuração de Imagem (Image Setting)
  • Operador de Imagem (Image Operator)
  • Operador de Canal de Imagem (Image Channel Operator)
  • Operador de Sequência de Imagens (Image Sequence Operator)
  • Geometria de Imagem (Image Geometry)
  • Pilha de Imagens (Image Stack)

Configuração de Imagem (Image Setting)

Uma configuração de imagem persiste a partir do ponto em que aparece na linha de comando e pode afetar o processamento subsequente, como a leitura de uma imagem, um operador de imagem ou, quando apropriado, a escrita de uma imagem. Uma configuração de imagem permanece em vigor até ser redefinida ou até a linha de comando terminar. As configurações de imagem incluem:

Neste exemplo, -channel aplica-se a cada uma das imagens, já que, como mencionamos, as configurações persistem:

magick -channel RGB wand.png wizard.png images.png

Operador de Imagem (Image Operator)

Um operador de imagem difere de uma configuração por afetar a imagem imediatamente, no ponto em que aparece na linha de comando. Um operador é qualquer opção de linha de comando não listada como configuração de imagem ou operador de sequência de imagens. Diferentemente de uma configuração de imagem, que persiste até a linha de comando terminar, um operador é aplicado ao conjunto de imagens atual e depois esquecido. Os operadores de imagem incluem:

Neste exemplo, -negate inverte a imagem wand, mas não a wizard:

magick wand.png -negate wizard.png images.png

Observe que um operador de imagem será aplicado a cada imagem em uma sequência de imagens. Por exemplo, se você usar a opção -resize para redimensionar uma imagem GIF, cada quadro será redimensionado para o tamanho indicado. No entanto, alguns quadros podem ser menores que a imagem inteira, e redimensionar todos os quadros para o mesmo tamanho pode resultar em uma saída inesperada. Nesse caso, deve-se usar -coalesce para preparar esses quadros.

Operador de Canal de Imagem (Image Channel Operator)

Opera diretamente sobre os canais da imagem:

Operador de Sequência de Imagens (Image Sequence Operator)

Um operador de sequência de imagens difere de uma configuração por afetar uma sequência de imagens imediatamente, no ponto em que aparece na linha de comando. Escolha entre estes operadores de sequência de imagens:

Neste exemplo, -append anexa três imagens em uma só:

magick mikayla.png picnic.png beach.png -append vacation.png

Geometria de Imagem (Image Geometry)

Muitas opções de linha de comando recebem um argumento de geometria para especificar coisas como a largura e a altura desejadas de uma imagem e outras quantidades dimensionais. Como os usuários desejam tantas variações quanto às dimensões, tamanhos e posições resultantes das imagens (e como o ImageMagick quer fornecê-las), o argumento de geometria pode assumir muitas formas. Descrevemos muitas delas nesta seção.

As opções e configurações de imagem que recebem alguma forma de argumento de geometria incluem as seguintes. Tenha em mente que algumas delas analisam seus argumentos de maneiras ligeiramente diferentes. Consulte a documentação de cada opção ou configuração específica para mais detalhes.

O argumento de geometria pode assumir qualquer uma das formas listadas na tabela abaixo. Elas serão descritas em mais detalhes nas subseções que se seguem à tabela. A forma usual é size[offset], significando que size é obrigatório e offset é opcional. Ocasionalmente, [size]offset é possível. Em nenhum caso são permitidos espaços dentro do argumento de geometria.

size Descrição geral (o comportamento real pode variar conforme diferentes opções e configurações)
scale% Altura e largura escalonadas pela porcentagem especificada.
scale-x%xscale-y% Altura e largura escalonadas individualmente pelas porcentagens especificadas. (Apenas um símbolo % é necessário.)
width Largura fornecida, altura selecionada automagicamente para preservar a proporção (aspect ratio).
xheight Altura fornecida, largura selecionada automagicamente para preservar a proporção.
widthxheight Valores máximos de altura e largura fornecidos, proporção preservada.
widthxheight^ Valores mínimos de largura e altura fornecidos, proporção preservada.
widthxheight! Largura e altura fornecidas de forma enfática, proporção original ignorada.
widthxheight> Reduz uma imagem com dimensão(ões) maior(es) que o(s) argumento(s) de largura e/ou altura correspondente(s).
widthxheight< Amplia uma imagem com dimensão(ões) menor(es) que o(s) argumento(s) de largura e/ou altura correspondente(s).
area@ Redimensiona a imagem para ter a área especificada em pixels. A proporção é preservada.
x:y^ remove linhas ou colunas para alcançar a proporção fornecida.
x:y# adiciona linhas ou colunas para alcançar a proporção fornecida.
{size}{offset} Especificando o deslocamento (offset) (o padrão é +0+0). Abaixo, {size} refere-se a qualquer uma das formas acima.
{size}{+-}x{+-}y Deslocamentos horizontal e vertical x e y, especificados em pixels. Os sinais são obrigatórios para ambos. Os deslocamentos são afetados pela configuração -gravity. Os deslocamentos não são afetados por % ou outros operadores de size. Observe que deslocamentos X e Y positivos vão na direção interna, em direção ao centro da imagem, para todas as opções de -gravity, exceto 'center'. Para East, +X é para a esquerda. Para South, +Y é para cima. Para SouthEast, +X é para a esquerda e +Y é para cima. Para center, é usada a convenção normal de direção de X e Y (+X é para a direita e +Y é para baixo).

Ajustes básicos de largura e altura; os operadores %, ^ e !

Aqui, logo abaixo, estão alguns exemplos simples de geometria, mostrando como ela pode ser usada como argumento da opção -resize. Usaremos a imagem interna logo: como nossa imagem de entrada. Esta bela imagem tem 640 pixels de largura e 480 pixels de altura. Dizemos que suas dimensões são 640x480. Quando indicamos as dimensões de uma imagem, a largura (a dimensão horizontal) sempre precede a altura (a dimensão vertical). Isso será verdade quando falarmos de coordenadas ou deslocamentos em uma imagem, que serão sempre o valor de x seguido pelo de y. Basta lembrar das suas aulas de álgebra do ensino médio e do plano xy. (Bem, quase: nosso eixo y sempre apontará para baixo!)

magick logo: -resize '200%' bigWiz.png
magick logo: -resize '200x50%' longShortWiz.png
magick logo: -resize '100x200' notThinWiz.png
magick logo: -resize '100x200^' biggerNotThinWiz.png
magick logo: -resize '100x200!' dochThinWiz.png

O primeiro dos quatro comandos é simples — ele estica tanto a largura quanto a altura da imagem de entrada em 200% em cada direção; amplia a coisa toda por um fator de dois. O segundo comando especifica porcentagens diferentes para cada direção, esticando a largura para 200% e comprimindo a altura para 50%. A imagem resultante (neste exemplo) tem dimensões 1280x240. Observe que o símbolo de porcentagem não precisa ser repetido; os seguintes são equivalentes: 200x50%, 200%x50, 200%x50%.

Por padrão, a largura e a altura fornecidas em um argumento de geometria são valores máximos, a menos que uma porcentagem seja especificada. Ou seja, a imagem é expandida ou contraída para caber nos valores de largura e altura especificados, mantendo a proporção (a razão entre sua altura e sua largura) da imagem. Por exemplo, o terceiro comando acima "tenta" definir as dimensões para 100x200. Imagine reduzir gradualmente a imagem original (que é 640x480), mantendo sua proporção constante, até que ela apenas caiba em um retângulo 100x200. Como a imagem é mais larga do que alta, ela caberá quando sua largura encolher para 100 pixels. Para preservar a proporção, a altura terá, portanto, que ser (480/640)×100 pixels = 75 pixels, de modo que as dimensões finais serão 100x75.

Observe que, no exemplo anterior, pelo menos uma das dimensões especificadas será atingida (neste caso, a largura, 100 pixels). A imagem resultante cabe justinha dentro da original. Pode-se fazer exatamente o oposto disso invocando o operador ^, como no quarto exemplo acima. Nesse caso, quando 100x200^ é fornecido como argumento, novamente pelo menos uma das dimensões será atingida, mas dessa vez a imagem resultante pode conter justinha a original. Aqui o argumento de geometria fornece valores mínimos. Em nosso exemplo, a altura se tornará 200 e a largura será escalonada para preservar a proporção, tornando-se (640/480)×200 pixels = 267 pixels. Com o operador ^, uma dessas dimensões corresponderá ao tamanho solicitado, mas a imagem provavelmente ultrapassará as dimensões solicitadas para preservar sua proporção. (O recurso ^ é novo a partir do IM 6.3.8-2.)

Vemos que o ImageMagick é muito bom em preservar as proporções das imagens, para evitar distorções de suas fotos e imagens favoritas. Mas você pode realmente querer que as dimensões sejam 100x200, esticando assim a imagem. Nesse caso, basta dizer ao ImageMagick que você fala sério (!) anexando um operador de exclamação à geometria. Isso forçará o tamanho da imagem a ser exatamente o que você especificar. Assim, por exemplo, se você especificar 100x200! as dimensões se tornarão exatamente 100x200 (resultando em um wizard pequeno e alongado verticalmente).

Limitando a largura, a altura e a área; os operadores >, < e @

Aqui estão mais alguns exemplos:

magick logo: -resize '100' wiz1.png
magick logo: -resize 'x200' wiz2.png
magick logo: -resize '100x200>' wiz3.png
magick logo: -resize '100x200<' wiz4.png

Se apenas uma dimensão for fornecida, ela é considerada a largura. Quando apenas a largura é especificada, como no primeiro exemplo acima, a largura é aceita como fornecida e a altura é escolhida para manter a proporção da imagem de entrada. De forma semelhante, se apenas a altura é especificada, como no segundo exemplo acima, a altura é aceita e a largura é escolhida para manter a proporção.

Use > para reduzir uma imagem somente se sua(s) dimensão(ões) for(em) maior(es) que os argumentos de largura e/ou altura correspondentes. Use < para ampliar uma imagem somente se sua(s) dimensão(ões) for(em) menor(es) que os argumentos de largura e/ou altura correspondentes. Em qualquer um dos casos, se uma alteração for feita, o resultado é como se o operador > ou < não estivesse presente. Assim, no terceiro exemplo acima, especificamos 100x200> e o tamanho da imagem original é 640x480, então o tamanho da imagem é reduzido como se tivéssemos especificado 100x200. No entanto, no quarto exemplo acima, não haverá alteração no seu tamanho.

Por fim, use @ para especificar a área máxima em pixels de uma imagem, novamente tentando preservar a proporção. (Os pixels assumem apenas valores inteiros, então alguma aproximação está sempre em ação.) No exemplo a seguir, uma área de 10000 pixels é solicitada. O arquivo resultante tem dimensões 115x86, que tem 9890 pixels.

magick logo: -resize '10000@' wiz10000.png

Em todos os exemplos acima e abaixo, colocamos os argumentos de geometria entre aspas. Fazê-lo é opcional em muitos casos, mas nem sempre. Devemos colocar as especificações de geometria entre aspas ao usar < ou > para evitar que esses caracteres sejam interpretados pelo shell como redirecionamento de arquivo. Em sistemas Windows, o acento circunflexo ^ precisa estar entre aspas, caso contrário é ignorado. Para garantir, provavelmente seria bom manter o hábito de colocar todos os argumentos de geometria entre aspas, como fizemos aqui.

Deslocamentos na geometria

Aqui estão alguns exemplos para ilustrar o uso de deslocamentos (offsets) em argumentos de geometria. Um uso típico de deslocamentos é em conjunto com a opção -region. Essa opção permite que muitas outras opções modifiquem os pixels dentro de uma subregião retangular especificada de uma imagem. Como tal, ela precisa receber a largura e a altura dessa região, além de um deslocamento na imagem, que é um par de coordenadas indicando a localização da região dentro da imagem maior. Abaixo, no primeiro exemplo, especificamos uma região de tamanho 100x200 a ser localizada nas coordenadas xy x=10, y=20. Vamos usar a notação algébrica usual (x,y)=(10,20), por conveniência.

magick logo: -region '100x200+10+20' -negate wizNeg1.png
magick logo: -region '100x200-10+20' -negate wizNeg2.png
magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png

Observe que os deslocamentos sempre exigem sinais +/−. O deslocamento não é, na verdade, uma localização verdadeira dentro da imagem; suas coordenadas precisam ser somadas a alguma outra localização. Vamos chamar isso de localização atual. Nos dois primeiros exemplos acima, porém, essa localização é o canto superior esquerdo da imagem, que tem coordenadas (0,0). (Essa é a situação padrão quando não há outras diretivas para alterá-la.) O primeiro exemplo acima coloca o próprio canto superior esquerdo do retângulo 100x200 em (10,20).

Um deslocamento negativo pode fazer sentido em muitos casos. No segundo exemplo acima, o deslocamento é (-10,20), especificado por -10+20. Nesse caso, apenas a parte do retângulo (virtual) obtido que fica dentro da imagem pode ser invertida; aqui isso equivale a especificar a geometria como 90x200+0+20.

No terceiro exemplo acima, a configuração -gravity precede as demais e define a localização atual dentro da imagem no exato centro da imagem. Nesse caso, isso fica no pixel (320,240), já que o tamanho da imagem é 640x480. Isso significa que os deslocamentos se aplicam a essa localização, que assim é movida, neste caso, para (320-10,240+20)=(310,260). Mas a própria região 100x200 também é afetada pela configuração -gravity, então, em vez de afetar seu canto superior esquerdo, é determinado o próprio centro da região (em (+50,+100) dentro dela). Portanto, o centro do retângulo 100x200 é movido para (310,260). O canto superior esquerdo do retângulo invertido fica agora em (310-50,260-100)=(260,160).

Pilha de Imagens (Image Stack)

Na escola, seu professor provavelmente permitia que você resolvesse problemas em um pedaço de papel de rascunho e depois copiasse os resultados para a folha da prova. Uma pilha de imagens é semelhante. Ela permite que você trabalhe em uma imagem ou sequência de imagens isoladamente e, posteriormente, reintroduza os resultados na linha de comando. A pilha de imagens é delimitada por parênteses. Os operadores de imagem afetam apenas as imagens da pilha atual. Por exemplo, podemos limitar a rotação da imagem apenas à imagem wizard assim:

magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif

Observe, mais uma vez, que os parênteses são escapados precedendo-os com barras invertidas. Isso é necessário no Linux, onde os parênteses são caracteres especiais do shell. A barra invertida diz ao shell para não interpretar esses caracteres, mas para passá-los diretamente ao comando que está sendo executado. Não escape os parênteses no Windows. Cada parêntese (ou parêntese escapado) deve ter espaços de ambos os lados, como no exemplo mostrado acima.

Além dos operadores de imagem já discutidos, os seguintes operadores de imagem são especialmente úteis ao processar imagens em uma pilha de imagens:

Os argumentos desses operadores são índices na sequência de imagens por número, começando em zero para a primeira imagem, e assim por diante. No entanto, se você fornecer um índice negativo, as imagens são indexadas a partir do final (última imagem adicionada). Ou seja, um índice de -1 é a última imagem na sequência de imagens atual, -2 fornece a penúltima, e assim por diante.

Nome do Arquivo de Saída

O ImageMagick estende o conceito de nome de arquivo de saída para incluir:

  1. um formato de imagem explícito
  2. escrever na saída padrão
  3. referências de nomes de arquivo

Cada uma dessas extensões é explicada nos próximos parágrafos.

Em vez de um nome de arquivo de saída, você usa -exit para impedir completamente qualquer escrita de imagem.

Formato de Imagem Explícito

As imagens podem ser armazenadas em uma infinidade de formatos de imagem, incluindo os mais conhecidos JPEG, PNG, TIFF e outros. O ImageMagick precisa conhecer o formato desejado da imagem antes de ela ser escrita. O ImageMagick recorre à extensão do nome do arquivo para determinar o formato. Por exemplo, image.jpg indica ao ImageMagick para escrever a imagem no formato JPEG. Em alguns casos, o nome do arquivo não identifica o formato da imagem. Nesses casos, a imagem é escrita no formato em que foi originalmente lida, a menos que um formato de imagem explícito seja especificado. Por exemplo, suponha que queremos escrever nossa imagem em um nome de arquivo image no formato bruto de intensidade de vermelho, verde e azul:

magick image.jpg rgb:image

Saída Padrão

O Linux permite que a saída de um comando seja canalizada para outro. O ImageMagick permite canalizar um comando para outro com um nome de arquivo -. Neste exemplo, canalizamos a saída do magick para o programa display:

magick logo: gif:- | magick display gif:-

Aqui o formato explícito é opcional. O formato de imagem GIF tem uma assinatura que o identifica unicamente, então o ImageMagick consegue reconhecer prontamente o formato como GIF.

Referências de Nomes de Arquivo

Opcionalmente, use um caractere de formatação incorporado para escrever uma lista sequencial de imagens. Suponha que nosso nome de arquivo de saída seja image-%d.jpg e nossa lista de imagens inclua 3 imagens. Você pode esperar que estes arquivos de imagem sejam escritos:

image-0.jpg
image-1.jpg
image-2.jpg

Ou recupere propriedades da imagem para modificar o nome do arquivo de imagem. Por exemplo, o comando

magick rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'

escreve uma imagem com este nome de arquivo:

rose-70x46.png

Por fim, para converter várias imagens JPEG em páginas PDF individuais, use:

magick *.jpg +adjoin page-%d.pdf

Use -define filename:literal=true para contornar a interpretação dos caracteres de formatação incorporados e, em vez disso, usar o nome do arquivo literalmente.

Buffer de Fluxo

Por padrão, o fluxo de saída é armazenado em buffer. Para garantir que as informações apareçam no arquivo de destino ou no terminal assim que forem escritas, defina o tamanho do buffer como 0:

magick -define stream:buffer-size=0 logo: gif:- | magick display gif:-