如何从多个 png 图像创建动画 gif 图像?

Posted

技术标签:

【中文标题】如何从多个 png 图像创建动画 gif 图像?【英文标题】:How to create an animated gif image from a number of png images? 【发布时间】:2019-10-20 08:58:06 【问题描述】:

我有一个图像文件“image.png”,我想用它创建一个 .gif 图像。 我编写了一个小脚本来获取该图像的 100 个不同大小(1% - 100%)的图像,然后我从包含文件夹中删除了原始图像(image.png),并使用此命令生成我的 gif 图像想要:

convert -delay 10 -loop 0 *.png image.gif

当我检查 gif 图像时,我可以看到最大的图像(100% 大小)作为静止图像(在我眼中),而较小的图像开始显示在图像的左上角,从 1% - 100%,100% 的图像与始终显示的原始图片一致。 我希望在我使用的图像软件 (gthumb) 中看到图像从矩形/正方形的中心变大,这不是我得到的?

我检查了较小的图像,它们很好,我还高速运行了图像的幻灯片放映,并向我展示了我希望在我的 gif 文件中包含的内容。我使用 Linux。

更新 1: 这是我在“Mark Setchell”回复之前用来生成 100 张图像的脚本:

#!/bin/bash
for i in 1..100;
do
if [ $i -lt 10 ]; then
convert -resize $i% lena.png 00$i.png
elif [ $i -lt 100 ]; then
convert -resize $i% lena.png 0$i.png
else
convert -resize $i% lena.png $i.png
fi
done

它产生了 100 张图像。 然后根据“Mark Setchell”的回复,我使用了以下代码:

for ((i=0;i<100;i++)) ; do
   convert checked-box.png -resize $i% -background none -gravity center -extent 512x512 miff:-
done | convert miff:- -delay 80 anim.gif

here 是我得到的结果。 这是我使用的lena.png。

更新 2:

我编辑了以下命令来更改输入文件名。

for ((i=0;i<100;i++)) ; do
       convert lena.png -resize $i% -background none -gravity center -extent 512x512 miff:-
    done | convert miff:- -delay 80 anim.gif

【问题讨论】:

尝试将生成 100 张图片的脚本更改为 convert input.png ...as before... +repage -gravity center -background none -extent WIDTHxHEIGHT frame-00N.png,其中 WIDTH 和 HEIGHT 是最终 GIF 图像的大小。 convert checked-box.png +repage -gravity center -background none -extent 256x256 frame-100.png 生成单个 png 文件 (frame-100.png) 请编辑您的问题并展示您是如何生成 100 张图片的。 我使用了我写的以下脚本:#!/bin/bash for i in 1..100; do if [ $i -lt 10 ]; then convert -resize $i% checked-box.png 00$i.png elif [ $i -lt 100 ]; then convert -resize $i% checked-box.png 0$i.png else convert -resize $i% checked-box.png $i.png fi done 我不明白为什么当我的命令已经自己生成它们时,你又生成了 100 张图像?我也不明白为什么你说你使用lena 时使用名为checked_box 的图像作为输入? 【参考方案1】:

我猜你想要类似下面的东西。我避免将所有 100 个中间文件写入磁盘,而是以流格式(MIFFMagick Image File Format)将它们写入最终的convert,将它们全部收集起来起来并为它们设置动画。另一个“技巧”是将每张图片放在透明背景上的中心 (-background none),以便 GIF 的所有帧大小相同。

for ((i=0;i<100;i++)) ; do
   convert lena.png -resize $i% -background none -gravity center -extent 512x512 miff:-
done | convert miff:- -delay 80 anim.gif


请注意,-extent 参数决定了最终图像的尺寸。如果您使范围小于原始图像,您将获得超过 1:1 全尺寸的缩放。我猜您可能希望范围设置与您的输入图像完全匹配,那么动画的最后一帧将是您完整的、未裁剪的原始图像。但是你现在有代码了,所以试验一下吧!

请注意,您可以向后运行动画并创建缩小效果,而不是通过将循环从 100 向后运行到 1 或通过在 -delay 之前添加 -reverse 来反转帧的顺序来进行缩放。


关键字:ImageMagick、图像、图像处理、缩放、缩小、GIF、动画 GIF、命令行

【讨论】:

请注意,答案中包含的动画不是命令生成的实际动画,因为它超过了 *** 的 2MB 限制,所以我制作了一个较小的动画,因为它的帧数较少,所以不太流畅。 它在图像从中心开始的意义上起作用。但是我还是把原图作为背景,即图像从小到大开始,原图是背景。我检查了“lena.png”以确保我的图像没有问题,但还是一样。我使用 Linux Mint 并尝试了 Xviewer 版本 1.8.1 和 gthumb。 请在您的原始问题下单击edit,并添加您使用的确切图像和代码,并尽可能提供指向您的结果的链接 - 通过 Dropbox 或 Google Drive 等。谢谢。 我相信我可以解决后台问题。我使用了这个命令(实际上和你的一样,没有-background none参数:for ((i=0;i&lt;100;i++)) ; do convert lena.png -resize $i% -gravity center -extent 512x512 miff:-; done | convert miff:- -delay 80 anim.gif现在我可以得到你的gif图像了。

以上是关于如何从多个 png 图像创建动画 gif 图像?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 Java 中的多个图像创建一个 Gif 图像? [关闭]

如何将多个 PNG 文件转换为动画 GIF? [关闭]

网页图片jpg,gif,png对比。

PHP - 从两个 JPEG 图像创建简单的动画 GIF?

[工具] GIF 动画每帧合并到一张 PNG

如何从电影创建动画 .gif?