WPF 一个性能比较好的 gif 解析库
本文介紹 Magick.NET ,這是 ImageMagick 的 .Net 封裝,他支持 100 多種格式的圖片,而 gif 也是他支持的。本文告訴大家如何使用這個庫播放 gif 圖
先給大家看一下播放下面這個圖片需要的內存。
這個庫的好處是可以在解析的時候使用比較多的內存,解析完成就不需要那么多的內存。而其他的庫解析或播放都需要很多內存。從上面的圖看到,解析圖片需要使用800M內存,解析完成需要200M內存,有很多資源都被釋放。
下面告訴大家如何使用這個庫。
使用 Nuget 搜索 Magick.NET 就可以找到。如果看到了很多版本,不要害怕。這個庫需要說明是哪個版本,其中Qn就是表示質量,推薦使用Q8,而這個庫需要指定cpu,于是就可以找到需要的庫。
使用Nuget安裝之后就可以使用,例如需要播放 E:\temp\2017年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博客
WPF 如何顯示gif - CSDN博客
WPF播放GIF控件完整代碼 - CSDN博客
WPF中顯示GIF圖片 - CSDN博客
我搭建了自己的博客 https://blog.lindexi.com/ 歡迎大家訪問,里面有很多新的博客。只有在我看到博客寫成熟之后才會放在csdn或博客園,但是一旦發布了就不再更新
如果在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布。如有任何疑問,請與我聯系。
總結
以上是生活随笔為你收集整理的WPF 一个性能比较好的 gif 解析库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四旋翼飞行器2——自己设计四旋翼飞行器的
- 下一篇: 大话设计模式(更新ing...)