使用ImageMagick将动画gif的背景更改为透明,但框架重叠。怎么解决?

时间:2014-04-24 16:53:09

标签: image imagemagick gif transparent

我想将gif背景更改为透明,我使用ImageMagick的以下命令:

  
    

转换input.gif -transparent white output.gif

  

但是,输出具有重影效果,后面的帧与之前的帧重叠。

//对不起,我发布自己的图片并不具备良好的声誉。 这里有一个例子:http://tieba.baidu.com/p/1090763568

如何让它们不重叠?或者换句话说,没有重影效应?

2 个答案:

答案 0 :(得分:2)

我认为"回答" 是因为它是一个制作糟糕的动画。您可以通过ImageMagick看到动画由12帧构成:

identify anim.gif

anim.gif[0] GIF 400x350 400x350+0+0 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[1] GIF 1x1 400x350+0+0 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[2] GIF 226x152 400x350+85+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[3] GIF 218x152 400x350+89+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[4] GIF 210x152 400x350+93+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[5] GIF 202x152 400x350+97+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[6] GIF 194x152 400x350+101+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[7] GIF 194x152 400x350+101+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[8] GIF 202x152 400x350+97+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[9] GIF 210x152 400x350+93+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[10] GIF 218x152 400x350+89+8 8-bit sRGB 256c 106KB 0.000u 0:00.000
anim.gif[11] GIF 226x152 400x350+85+8 8-bit sRGB 256c 106KB 0.000u 0:00.000

您可以将图像分割为其构成框架,并使白色区域透明,如下所示:

convert anim.gif -transparent none frame-%02d.gif

-rw-r--r--   1 mark  staff      9777  4 May 11:11 frame-11.gif
-rw-r--r--   1 mark  staff      9732  4 May 11:11 frame-10.gif
-rw-r--r--   1 mark  staff      9681  4 May 11:11 frame-09.gif
-rw-r--r--   1 mark  staff      9835  4 May 11:11 frame-08.gif
-rw-r--r--   1 mark  staff      9533  4 May 11:11 frame-07.gif
-rw-r--r--   1 mark  staff      9479  4 May 11:11 frame-06.gif
-rw-r--r--   1 mark  staff      9986  4 May 11:11 frame-05.gif
-rw-r--r--   1 mark  staff      9907  4 May 11:11 frame-04.gif
-rw-r--r--   1 mark  staff     10070  4 May 11:11 frame-03.gif
-rw-r--r--@  1 mark  staff     10099  4 May 11:11 frame-02.gif
-rw-r--r--   1 mark  staff        43  4 May 11:11 frame-01.gif
-rw-r--r--@  1 mark  staff     15917  4 May 11:11 frame-00.gif

您还可以像这样一起剪辑所有帧:

convert anim.gif -transparent white miff:- | montage -tile 3x -frame 5 - montage.jpg

enter image description here

如果您尝试使用background的处理方法将帧重新组合在一起,您将丢失仅出现在第一帧中的单词welcome

convert -dispose background frame-0* a.gif

enter image description here

如果你试图复合的第一帧(让你有"欢迎")与动画之前每个人的,你会得到一个黑色的幽灵,因为男孩和女孩人物也出现在第一帧:

convert frame-00.gif frame-02.gif -geometry +85+8 -composite x.gif

enter image description here

我看到的唯一解决方案是将第一帧带入Photoshop并移除男孩和女孩,然后重建动画......但是再一次,我不是动画专家,现在所有的帧都是 "在桌子上#34; ,其他人可能会告诉你一个更简单的方法。

答案 1 :(得分:1)

如果您使用Gimp进行编辑,可以选择更改处理方法以替换("未指定的帧处理:每层一帧(替换)",以便每个帧在完全清除前一个之后渲染。)

但是,如果你不想一次编辑每个文件,使用另一个程序,我已经创建了一个ruby脚本来为我解决这个问题(如果你需要它可以批量修复) )。 我发现的唯一方法是将ImageMagick使用的处理方法二进制替换为Gimp使用的方法的值("替换",9:唯一适用于动画的方法)据我所知,具有透明背景的GIF)。注意:要运行脚本,您必须安装ruby(如果您没有),并编辑您希望处理的文件名。

Ruby script to change gif's disposal method to "replace"

Script's description (with a description of the problem and sample animations, overlapping (buggy) and replacing (working)