Magick.net 调整 GIF 大小,最终文件更大

Posted

技术标签:

【中文标题】Magick.net 调整 GIF 大小,最终文件更大【英文标题】:Magick.net resize GIF ending up with larger file size 【发布时间】:2019-01-22 15:38:52 【问题描述】:

我正在使用 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

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

【问题讨论】:

原因是 GIF 包含的颜色数量有限(最多 256 种)。如果您从 8 色开始并调整大小,则调整大小会在相邻像素之间进行插值并产生新的颜色。除非您再次将颜色限制为 8 种,否则您的文件将有更多颜色,因此大小会更大。 @fmw42 实现这一目标的代码到底是什么?谢谢。 我不知道 Windows 端口,但可以想象你需要移动你的两个 Optimize() 调用之后 Resize() 我试过在Resize后调用这两个Optimize,没用。 【参考方案1】:

原因是 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。

【讨论】:

感谢您的回答。你知道怎么用 C# 写吗? 对不起,我只知道 Imagemagick 命令行。但您可以在imagemagick.org/discourse-server 询问。有一个 Magick.NET 论坛或用户论坛。

以上是关于Magick.net 调整 GIF 大小,最终文件更大的主要内容,如果未能解决你的问题,请参考以下文章

在不破坏动画的情况下调整动画 GIF 文件的大小

枕头 - 调整 GIF 的大小

如何改进我的 php 图像调整器以支持 alpha png 和透明 GIF

调整动画 GIF 大小的 Python 问题

同时使用FFMPEG调整GIF的大小时的分带/结尾

调整 GIF 动画、pil/imagemagick、python 的大小