ImageMagick 雨刮器效果 gif 帧数更少

Posted

技术标签:

【中文标题】ImageMagick 雨刮器效果 gif 帧数更少【英文标题】:ImageMagick wiper effect gif with less frames 【发布时间】:2018-10-26 07:59:24 【问题描述】:

此问题的可能历史记录:Eliminate slow speed factor in ffmpeg and image-magic commands

我正在使用此命令创建一个带有刮水器效果的 GIF,

convert -gravity southeast logo.png  -write MPR:logo \
  \( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
  \( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after  \) \
  -delete 0--1                                           \
  MPR:before  \( MPR:after  -set delay 25 -crop 15x0 -reverse     \) \
  MPR:after   \( MPR:before -set delay 27 -crop 15x0   \) \
  -set delay 2 -loop 0 temp.gif -delete 1--1 -resize 640x thumb.jpg

这一切正常,但它创建了一个大小为 3MB+ 的 gif,因为有超过 100 帧的雨刷效果。

我们如何减少雨刷效果的帧数,同时质量保持不变,但尺寸减小?我尝试使用不同的循环值附加不同的参数,但没有任何效果。

【问题讨论】:

更改延迟值以减少帧数。或者重新处理您的动画 gif,以便所有帧使用相同的颜色图。请参阅 -remap imagemagick.org/Usage/quantize/#remap。您可以通过添加跨越动画的所有或选定帧并将颜色减少到 255 种来创建颜色图,然后获取唯一颜色并为所有 255 种颜色创建附加的 1x1 像素颜色的图像。 你能举个例子吗? 也许我理解错了。我以为你在创建一个 gif 动画。但是您的结果是 thumb.jpg,即 JPG 文件而不是动画。请澄清。如果您真的要制作 GIF 动画,请发布指向您的动画的链接。 上面的命令创建了 2 个东西,一个 gif 和一个缩略图。你可以离开这部分-delete 1--1 -resize 640x thumb.jpg,命令正在创建这样的文件media.evercam.io/v1/cameras/crome-tidcz/compares/… 上面的命令是获取徽标和前后图像并创建一个 gif。它有 178 帧。我需要降低帧,但以相同的速度和尺寸减小 【参考方案1】:

这里有 3 个 Imageamagick 命令。第一个是你上面的。在第二个中,我从两个输入图像(之前和之后)创建一个公共颜色映射图像,并将其应用于每一帧。第三,我做了同样的色图处理,但是减少了帧数。我从网站上提取了所有图片和引用的动画,并将新徽标放在左下角,因为右下角已经有一个。请注意,我添加了 -layers optimize to all,这大大减少了文件大小。

标志:

之前:

之后:

方法一(原文):

convert -gravity southwest everlogo.png -write MPR:logo \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
MPR:before \( MPR:after -set delay 25 -crop 15x0 -reverse \) \
MPR:after \( MPR:before -set delay 27 -crop 15x0 \) \
-set delay 2 -layers optimize -loop 0 temp1a.gif
2,246,665 bytes
174 frames

结果太大,无法在此处上传。

方法2(常用色图):

convert -gravity southwest \
everlogo.png -write MPR:logo +delete \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
\( MPR:before MPR:after +append +dither -colors 255 -unique-colors -write MPR:colors +delete \) \
MPR:before +dither -remap MPR:colors \( MPR:after +dither -remap MPR:colors -set delay 25 -crop 15x0 -reverse \) \
MPR:after+dither -remap MPR:colors \( MPR:before +dither -remap MPR:colors -set delay 27 -crop 15x0 \) \
-set delay 2 -layers optimize -loop 0 temp1b.gif
2,004,345 bytes
173 frames

方法3(普通色图;两倍裁剪宽度和四倍延迟;根据需要调整延迟以更好地匹配方法2)

convert -gravity southwest \
everlogo.png -write MPR:logo +delete \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
\( MPR:before MPR:after +append +dither -colors 255 -unique-colors -write MPR:colors +delete \) \
MPR:before +dither -remap MPR:colors \( MPR:after +dither -remap MPR:colors -set delay 100 -crop 30x0 -reverse \) \
MPR:after+dither -remap MPR:colors \( MPR:before +dither -remap MPR:colors -set delay 108 -crop 30x0 \) \
-set delay 4 -layers optimize -loop 0 temp1c.gif
1,927,359 bytes
87 frames

我有点惊讶的是,如此显着地减少帧数并没有相应地减少动画文件的大小。但我怀疑这是由于 -layers 优化造成的。

补充:

同样在上面的所有代码中,我不明白在括号内设置延迟 25 和 27 然后再将其设置为 2 的用途。我认为动画 gif 不会有不同的延迟。唯一重要的是最后一个。

因此,就延迟和帧数而言,这两者是相同的。第一个使用 -crop 15x0 和 -set delay 4,第二个使用 -crop 30x0 和 -set delay 8。这会产生相同的速度动画,但第二个具有更少的帧。第一个是 174,第二个是 88,所以更粗略。但文件大小大致相同。所以看来,常见的颜色图导致文件大小的最大减少。

convert -gravity southwest everlogo.png -write MPR:logo \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
MPR:before \( MPR:after -crop 15x0 -reverse \) \
MPR:after \( MPR:before -crop 15x0 \) \
-set delay 4 -layers optimize -loop 0 temp3.gif
frames 174
2,246,665 bytes

convert -gravity southwest everlogo.png -write MPR:logo \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
MPR:before \( MPR:after -crop 30x0 -reverse \) \
MPR:after \( MPR:before -crop 30x0 \) \
-set delay 8 -layers optimize -loop 0 temp2.gif
frames 88
2,174,954 bytes

【讨论】:

以上是关于ImageMagick 雨刮器效果 gif 帧数更少的主要内容,如果未能解决你的问题,请参考以下文章

使用PythonOpenCV,ImageMagick工具箱根据原始视频制作GIF动画

PHP使用ImageMagick操作gif图

PHP使用ImageMagick操作gif图

使用ImageMagick操作gif图

将精灵表转换为 gif 动画

vue裁剪gif图片并保持动画效果