ImageMagick - 从平铺图像创建动画 GIF,遇到“虚拟画布”元数据问题

ImageMagick - 从平铺图像创建动画 GIF,遇到“虚拟画布”元数据问题

我有一张图片,其中包含与此类似的较小图像:

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

每个子图像为 100x200,整个图像为 100x800

我想将它们全部组合成一个动画,循环播放图像 1 至 4。

我使用 imagemagick 的convert工具来裁剪图片。例如,我创建了一个批处理文件

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

然后在名为main.jpg

这会创建一组图像,但是当我尝试将它们转换为 gif 时,就像这样

convert *.png out.gif

我得到的不是单个尺寸为 100x200 的动画,而是尺寸为 100x800 的动画,并且图像只是在某些偏移量处弹出。

当我identify裁剪几张图片时,它给了我

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

推测是 imagemagick 试图通过读取元数据并确定我实际上想要使用 100x800 画布来提供帮助,并且每个图像都应该放置在特定的偏移量处。但这并不是我想要的。

确实,阅读教程,imagemagick 确实将它留在那里以帮助您。

也就是说,IM 保留了图像的“虚拟画布”、“页面”或“分层”信息,以便以后使用。这对于正确处理 GIF 动画尤其重要。

当我在 Paint 中手动打开每个文件,然后重新保存时,当我重新识别时main_02.png,我得到了

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

对所有图像执行此操作后,我再次将其转换为 gif,最后它变成了 100x200 的 gif,看起来像我想要的。

我怎样才能将所有偏移量设置为(0,0),这样我就不必通过绘画手动完成此操作?

答案1

+repage您可以在裁剪后通过执行以下操作来重置虚拟画布坐标:

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

另外,您不需要批处理文件来将图像分割成图块;如果您仅指定大小,它就会为您分割成图块,在输出文件名中使用“%d”表示图块编号:

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

或者在你的情况下使用两位数的固定宽度数字:

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

这将生成四张图像。

实际上,您也可以在同一个命令中执行 GIF 转换,而根本不需要生成临时的中间图像文件。以下命令将一举完成您想要的一切:

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

有关详细信息,请参阅文档-crop并且+repage(请注意,它-repage本身也可以用来编辑任何图像中的虚拟画布数据)。


顺便说一下,分割图像的另一种方法是指定数字瓷砖的数量,而不是瓷砖的大小;您可以通过指定大小来实现在瓷砖中裁剪并附加“@”符号,例如,这会产生与上面相同的结果:

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

相关内容