WPF 一个性能比较好的 gif 解析库
本文介紹 Magick.NET ,這是 ImageMagick 的 .Net 封裝,他支持 100 多種格式的圖片,而 gif 也是他支持的。本文告訴大家如何使用這個(gè)庫(kù)播放 gif 圖
先給大家看一下播放下面這個(gè)圖片需要的內(nèi)存。
這個(gè)庫(kù)的好處是可以在解析的時(shí)候使用比較多的內(nèi)存,解析完成就不需要那么多的內(nèi)存。而其他的庫(kù)解析或播放都需要很多內(nèi)存。從上面的圖看到,解析圖片需要使用800M內(nèi)存,解析完成需要200M內(nèi)存,有很多資源都被釋放。
下面告訴大家如何使用這個(gè)庫(kù)。
使用 Nuget 搜索 Magick.NET 就可以找到。如果看到了很多版本,不要害怕。這個(gè)庫(kù)需要說(shuō)明是哪個(gè)版本,其中Qn就是表示質(zhì)量,推薦使用Q8,而這個(gè)庫(kù)需要指定cpu,于是就可以找到需要的庫(kù)。
使用Nuget安裝之后就可以使用,例如需要播放 E:\temp\2017年9月1日 16.gif 那么需要寫(xiě)一個(gè)Image控件和在后臺(tái)寫(xiě)很少代碼。
<Image x:Name="G"></Image>后臺(tái)需要使用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());}}接下來(lái)就是播放圖片,使用一個(gè)循環(huán)播放
Task.Run(async () =>{while (true){await Dispatcher.InvokeAsync(() =>{G.Source = image[n];});n++;if (n == image.Count){n = 0;}await Task.Delay(100);}});運(yùn)行就可以看到,播放圖片。就是上面的截圖。但是程序有小問(wèn)題,就是沒(méi)有拿到圖片播放間隔,這個(gè)可以通過(guò) magickImage.AnimationDelay拿到,這個(gè)數(shù)是 1/100 秒,所以一般使用 *10 結(jié)果是毫秒 。
一般在使用ToBitmapSource需要使用AdaptiveResize這個(gè)方法可以讓gif顯示播放的圖片大小,使用這個(gè)函數(shù)可以獲得比較少的內(nèi)存。
于是播放 gif 的代碼很簡(jiǎn)單,打開(kāi) 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);}});我把最近寫(xiě)的 gif 使用方法寫(xiě)到一個(gè)博客,歡迎大家來(lái)看這個(gè)博客 WPF 播放 gif
參見(jiàn):水印第三版 ~ 變態(tài)水印(這次用Magick.NET來(lái)實(shí)現(xiàn),附需求分析和源碼) - 毒逆天 - 博客園
https://github.com/dlemstra/Magick.NET
其他解析gif 的方法:【續(xù)】WPF支持GIF的各種方法 - CSDN博客
WPF 如何顯示gif - CSDN博客
WPF播放GIF控件完整代碼 - CSDN博客
WPF中顯示GIF圖片 - CSDN博客
我搭建了自己的博客 https://blog.lindexi.com/ 歡迎大家訪問(wèn),里面有很多新的博客。只有在我看到博客寫(xiě)成熟之后才會(huì)放在csdn或博客園,但是一旦發(fā)布了就不再更新
如果在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業(yè)技術(shù)學(xué)院 歡迎大家加入
本作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問(wèn),請(qǐng)與我聯(lián)系。
總結(jié)
以上是生活随笔為你收集整理的WPF 一个性能比较好的 gif 解析库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 四旋翼飞行器2——自己设计四旋翼飞行器的
- 下一篇: 大话设计模式(更新ing...)