【发布时间】:2018-10-17 08:09:54
【问题描述】:
我正在尝试用一些位图图像创建一个 gif,它需要很长时间才能加载。为此,我按照库 github 页面上的示例进行操作。
这是我的代码:
public void SaveAsGif(Stream stream, ICollection<Bitmap> images, float fps, bool loop)
{
ICollection<IMagickImage> magickImages = new System.Collections.ObjectModel.Collection<IMagickImage>();
float exactDelay = 100 / fps;
foreach (Bitmap bitmap in images)
{
MagickImage image = new MagickImage(bitmap);
image.AnimationDelay = (int) exactDelay;
if (!loop)
{
image.AnimationIterations = 1;
}
magickImages.Add(image);
}
using (MagickImageCollection collection = new MagickImageCollection(magickImages))
{
QuantizeSettings settings = new QuantizeSettings();
settings.Colors = 256;
collection.Quantize(settings);
collection.Optimize();
collection.Write(stream, MagickFormat.Gif);
}
}
我测试过,图像从位图到 MagickImages 的转换不需要很长时间,最多 5 秒。我的图像大约是 4000x3000。 所有图像具有相同的大小。写入流也不需要很长时间。有什么方法可以改善时间?
【问题讨论】:
-
如果您能提供minimal reproducible example,我们可以将其复制到控制台应用程序中并重现您所看到的内容,那就太好了。
-
那里有多少张图片。时间花在哪里?在循环中?
-
ImageMagick 使用一种特殊的量化算法来处理 gif,这有点慢,因为您必须将颜色从数百万减少到 256。指定您自己的颜色映射并使用 -remap 转换为 256 可能会更快.见imagemagick.org/Usage/quantize/#remap
-
大约 70 张图片,运行我给你的这段代码大约需要 45 秒。对于 20 张图像,大约需要 20 秒。对于我想要使用的东西来说,这仍然太多了。
-
我发布了整个方法,只需使用位图、流、循环和 fps 列表调用它即可。
标签: c# .net imagemagick imagemagick.net