ImageMagick - Criando GIF animado a partir da imagem lado a lado, tendo problemas com os metadados de “tela virtual”

2

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

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

Cada sub-imagem é 100x200 e a imagem inteira é 100x800

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

Eu uso a ferramenta convert do imagemagick para cortar as imagens. Por exemplo, eu fiz 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, em seguida, execute-o em uma imagem chamada main.jpg

Isso cria um conjunto de imagens, mas quando eu 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 aparecem em determinados deslocamentos.

Quando eu identify algumas das imagens cortadas, 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, a imagemagick está tentando ser útil lendo os metadados e determinando que eu gostaria de usar uma tela 100x800, e cada imagem deve ser colocada nos deslocamentos específicos. Qual não é o que eu quero.

de fato, lendo o tutorial , o imagemagick deixa tudo para ajudá-lo.

That is IM retains the 'virtual canvas', 'page', or 'layering' information of the image so as to preserve it for later use. This is especially important for the correct working for GIF animation handling.

Quando abro cada arquivo manualmente na tinta e depois o salvo novamente, quando eu re-identifico main_02.png , obtenho

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

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

Como posso definir todos os deslocamentos como (0, 0) para que eu não precise fazer isso manualmente através de tinta?

    
por That Umbrella Guy 05.07.2014 / 04:19

1 resposta

1

Você pode redefinir as coordenadas da tela virtual fazendo +repage apó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 lotes 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 gerará quatro imagens.

Na verdade, você também pode fazer a conversão GIF no mesmo comando, sem ter que 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, consulte a documentação para -crop e também +repage (observe que -repage também pode ser usado para editar dados de telas virtuais em qualquer imagem por si só.

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

convert %1 -crop 1x4@ +repage %~n1_%02d.png
    
por 05.07.2014 / 04:46