1

我正在使用 Magick.net 调整动画 GIF 的尺寸,但较小尺寸的文件最终会具有较大的文件大小。

原始文件:500 x 225、443KB

调整大小的文件:400 x 180、488KB

这是我的代码

using (var imageColl = new MagickImageCollection(source))
{
  widthOrig = imageColl[0].Width;
  heightOrig = imageColl[0].Height;
  imageColl.Coalesce();
  imageColl.Optimize();
  imageColl.OptimizeTransparency();

  foreach (MagickImage image in imageColl)
  {
    var (width, height) = GetNewSize(widthOrig, heightOrig, 400);

    image.Resize(width, height);
  }

  // saving file omitted
}

有人可以指出我在调整大小后缺少什么来获得更小的文件吗?谢谢你。

4

1 回答 1

2

原因是 GIF 包含的颜色数量有限(最多 256 种)。如果您从较少的颜色开始并调整大小,则调整大小会在相邻像素之间进行插值并产生新的颜色。除非您再次将颜色限制回原来的颜色,否则您的文件将有更多颜色,因此大小会更大

对于单个 gif 图像,在 Imagemagick 中,您可以首先制作输入中唯一颜色的颜色表图像。

convert input.gif -unique-colors  colortable.gif


(见https://www.imagemagick.org/Usage/quantize/#extract)。

然后在调整大小后使用 -remap 将相同的颜色应用回调整大小的图像。

convert input.gif -resize WxH +dither -remap colortable.gif resized.gif


(见https://www.imagemagick.org/Usage/quantize/#remap

如果有一个动画 gif,那么您需要找到每帧的颜色数量并为每个帧创建一个可着色的。或者创建一个跨越动画中颜色的可着色对象。然后,您将分离动画的帧并将可着色应用到每个帧。然后将帧组合回动画。

相同的概念适用于在此链接上将电影转换为 gif 动画 - https://www.imagemagick.org/Usage/video/#gif。请注意,在此链接中,-map 是 -remap 的古老术语。所以使用-remap。

于 2018-08-15T23:38:23.677 回答