本文介绍 Magick.NET ,这是 ImageMagick 的 .Net 封装,他支持 100 多种格式的图片,而 gif 也是他支持的。本文告诉大家如何使用这个库播放 gif 图
先给大家看一下播放下面这个图片需要的内存。
这个库的好处是可以在解析的时候使用比较多的内存,解析完成就不需要那么多的内存。而其他的库解析或播放都需要很多内存。从上面的图看到,解析图片需要使用800M内存,解析完成需要200M内存,有很多资源都被释放。
下面告诉大家如何使用这个库。
使用 Nuget 搜索 Magick.NET 就可以找到。如果看到了很多版本,不要害怕。这个库需要说明是哪个版本,其中Qn就是表示质量,推荐使用Q8,而这个库需要指定cpu,于是就可以找到需要的库。
使用Nuget安装之后就可以使用,例如需要播放 E: emp2017年9月1日 16.gif
那么需要写一个Image控件和在后台写很少代码。
<Image x:Name="G"></Image>
后台需要使用collection = new MagickImageCollection(str)
获得文件,然后使用ToBitmapSource
获得图片。使用之前需要给缓存文件夹MagickAnyCPU.CacheDirectory = "E:\temp";
string str = "E:\temp\2017年9月1日 16.gif";
var image = new List<BitmapSource>();
using (collection = new MagickImageCollection(str))
{
collection.Coalesce();
foreach (var magickImage in collection)
{
image.Add(magickImage.ToBitmapSource());
}
}
接下来就是播放图片,使用一个循环播放
Task.Run(async () =>
{
while (true)
{
await Dispatcher.InvokeAsync(() =>
{
G.Source = image[n];
});
n++;
if (n == image.Count)
{
n = 0;
}
await Task.Delay(100);
}
});
运行就可以看到,播放图片。就是上面的截图。但是程序有小问题,就是没有拿到图片播放间隔,这个可以通过 magickImage.AnimationDelay
拿到,这个数是 1/100 秒,所以一般使用 *10
结果是毫秒 。
一般在使用ToBitmapSource
需要使用AdaptiveResize
这个方法可以让gif显示播放的图片大小,使用这个函数可以获得比较少的内存。
于是播放 gif 的代码很简单,打开 gif ,解析,播放。
string str = "E:\temp\2017年9月1日 16.gif";
var image = new List<(BitmapSource image,int delay)>();
using (collection = new MagickImageCollection(str))
{
collection.Coalesce();
foreach (var magickImage in collection)
{
magickImage.AdaptiveResize(100,100);
image.Add((magickImage.ToBitmapSource(), magickImage.AnimationDelay * 10));
}
}
Task.Run(async () =>
{
while (true)
{
await Dispatcher.InvokeAsync(() =>
{
G.Source = image[n].image;
});
n++;
if (n == image.Count)
{
n = 0;
}
await Task.Delay(image[n].delay);
}
});
我把最近写的 gif 使用方法写到一个博客,欢迎大家来看这个博客 WPF 播放 gif
参见:水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码) - 毒逆天 - 博客园
https://github.com/dlemstra/Magick.NET
其他解析gif 的方法:【续】WPF支持GIF的各种方法 - CSDN博客
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。