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 大小,最终文件更大的主要内容,如果未能解决你的问题,请参考以下文章