Image 调整电影图(动画GIF)大小时出现的问题

Image 调整电影图(动画GIF)大小时出现的问题,image,image-processing,graphics,imagemagick,graphicsmagick,Image,Image Processing,Graphics,Imagemagick,Graphicsmagick,我在调整电影图片大小时遇到问题。如果您不知道,它们是gif,其中仅对图像的一部分设置动画,而常规gif中对整个图像设置动画。下面是一个node.js示例: // ![http://i.imgur.com/Qb1m0.gif][1] var gm = require('gm') var file = 'Qb1m0.gif', frags = file.split('.') gm(file) //.noProfile() //.quality(80) .resize(200

我在调整电影图片大小时遇到问题。如果您不知道,它们是gif,其中仅对图像的一部分设置动画,而常规gif中对整个图像设置动画。下面是一个node.js示例:

// ![http://i.imgur.com/Qb1m0.gif][1]

var gm = require('gm')

var file = 'Qb1m0.gif',
    frags = file.split('.')

gm(file)
  //.noProfile()
  //.quality(80)
  .resize(200, 200)
  .write(frags[0] + '_200.' + frags[1], function(err) {
    if (err) console.error(err)
  })

// Result:
// ![http://i.imgur.com/eFqak.gif][2]
等效cmd行代码为:

gm convert Qb1m0.gif -resize 200x200 cinema_200.gif
知道发生了什么吗

原始动画GIF:

调整大小的动画GIF:
我确实比GraphicsMagick更了解ImageMagick。对于ImageMagick,以下语句适用:

  • 如果GIF包含透明度,则几乎不可能使用简单的命令行(如您给出的命令行)直接调整动画GIF的大小

  • 如果动画GIF不包含透明度,那么实现这一点甚至很困难

我想这对GraphicsMagick来说也是一样的,真的

背景说明 如果使用
标识查看原始GIF,您会发现并非每个帧都有相同的尺寸:

identify Qb1m0.gif Qb1m0.gif[1] GIF 720x416 720x416+0+0 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[1] GIF 471x122 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[2] GIF 471x121 720x416+160+76 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[3] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[4] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[5] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[6] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[7] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[8] GIF 471x122 720x416+160+76 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[9] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.009 Qb1m0.gif[10] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.000 Qb1m0.gif[11] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.000 Qb1m0.gif[12] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.000 Qb1m0.gif[13] GIF 471x122 720x416+160+76 8-bit PseudoClass 256c 920KB 0.000u 0:00.000 Qb1m0.gif[14] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.000 Qb1m0.gif[15] GIF 471x123 720x416+160+75 8-bit PseudoClass 256c 920KB 0.000u 0:00.000 结果:

此命令将解决框架优化问题。它将以增加文件大小为代价纠正由此产生的问题


但是,当涉及到边缘时,它仍然可能显示“楼梯”瑕疵,因为调整大小的帧将出现可怕的锯齿。这是因为消除混叠需要在边缘周围使用半透明颜色,但GIF无法保存由
-resize
操作符生成的半透明颜色。

您还可以尝试添加
-layers-optimize
欲知详情

还有一个非常好的与ImageMagick无关的解决方案,它使用工具生成的gifs plus更小,没有任何闪烁问题,也没有特殊的命令行参数,因此非常简单,工作速度也更快。像这样使用它:

gifsicle --scale 0.25 -i input.gif > output.gif 


嗯,谢谢。我想我会忽略调整电影图片的大小
Qb1m0.gif[1]gif 471x122 720x416+160+75
比较第3个参数和第4个参数的大小是否是检测电影图像的好方法?您可以运行
identifite-format“%W x%H\n”your.gif
直接查询gif中每个帧的宽度和高度。但也可能有一些没有不同帧大小的电影。我认为最“可靠”的问题是:“(1)它是GIF吗?”(2)它是否包含多个帧?”。如果这两个问题的答案都是“是”,那么您可能会有一个动画GIF。
gifsicle --scale 0.25 -i input.gif > output.gif 
gifsicle --resize 24x24 -i input.gif > output.gif