ImageMagick - Criando GIF animado a partir de imagem lado a lado, tendo problemas com metadados de "tela virtual"

ImageMagick - Criando GIF animado a partir de imagem lado a lado, tendo problemas com metadados de "tela virtual"

Eu tenho uma imagem que contém imagens menores semelhantes a esta:

------
| 1  |
------
| 2  |
------
| 3  |
------
| 4  |
------

Cada subimagem tem 100x200 e a imagem inteira tem 100x800

Eu gostaria de combiná-los todos em uma única animação que percorrerá as imagens 1 a 4.

Eu uso converta ferramenta do imagemagick para cortar as imagens. Por exemplo, criei um arquivo em lote

convert %1 -crop 100x200+0+0 %~n1_01.png
convert %1 -crop 100x200+0+200 %~n1_02.png
convert %1 -crop 100x200+0+400 %~n1_03.png
convert %1 -crop 100x200+0+600 %~n1_04.png

E então execute-o em uma imagem chamadamain.jpg

Isso cria um conjunto de imagens, mas quando tento convertê-las em um GIF assim

convert *.png out.gif

Em vez de uma única animação de tamanho 100x200, recebo uma animação de tamanho 100x800 e as imagens simplesmente aparecem em determinados deslocamentos.

Quando eu identifycoloco algumas imagens recortadas, isso me dá

main_01.png PNG 100x200 100x800+0+0 8-bit sRGB 4.74KB 0.000u 0:00.000
main_02.png PNG 100x200 100x800+0+200 8-bit sRGB 3.39KB 0.000u 0:00.000

Presumivelmente, o imagemagick está tentando ser útil lendo os metadados e determinando que eu realmente gostaria de usar uma tela de 100x800 e que cada imagem deveria ser colocada em deslocamentos específicos. O que não é o que eu quero.

na verdade, lendo otutorial, o imagemagick deixa isso lá para ajudá-lo.

Ou seja, o IM retém as informações de 'tela virtual', 'página' ou 'camadas' da imagem para preservá-las para uso posterior. Isto é especialmente importante para o correto funcionamento do tratamento de animações GIF.

Quando abro cada arquivo manualmente no Paint e o salvo novamente, quando me identifico novamente main_02.png, recebo

main_02.png PNG 100x200 100x200+0+0 8-bit sRGB 4.03KB 0.000u 0:00.000

Fazendo isso para todas as imagens, faço novamente a conversão para gif e finalmente fica um gif 100x200 que fica parecido com o que eu quero.

Como posso definir todos os deslocamentos como (0, 0) para não precisar fazer isso manualmente por meio do Paint?

Responder1

Você pode redefinir as coordenadas da tela virtual fazendo +repageapós o corte:

convert %1 -crop 100x200+0+0 +repage %~n1_01.png
convert %1 -crop 100x200+0+200 +repage %~n1_02.png
convert %1 -crop 100x200+0+400 +repage %~n1_03.png
convert %1 -crop 100x200+0+600 +repage %~n1_04.png

Além disso, você não precisa de um arquivo em lote para dividir a imagem em blocos; se você especificar apenas um tamanho, ele será dividido em blocos para você, use "%d" no nome do arquivo de saída para o número do bloco:

convert %1 -crop 100x200 +repage %~n1_%d.png

Ou no seu caso com o número de largura fixa de dois dígitos:

convert %1 -crop 100x200 +repage %~n1_%02d.png

Isso irá gerar quatro imagens.

Na verdade, você também pode fazer a conversão de GIF no mesmo comando, sem precisar gerar arquivos de imagem intermediários temporários. O comando a seguir fará tudo o que você quiser de uma só vez:

convert %1 -crop 100x200 +repage out.gif

Para mais informações, vejaa documentação para-crope também+repage(observe que -repagetambém pode ser usado para editar dados de tela virtual em qualquer imagem).


A propósito, uma forma alternativa de dividir imagens é especificar onúmeronúmero de ladrilhos em vez do tamanho dos ladrilhos; você pode fazer isso especificando o tamanhoem azulejospara cortar e anexar um sinal "@", por exemplo, isso produz os mesmos resultados acima:

convert %1 -crop 1x4@ +repage %~n1_%02d.png

informação relacionada