日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

WPF 一个性能比较好的 gif 解析库

發(fā)布時(shí)間:2023/12/14 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF 一个性能比较好的 gif 解析库 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文介紹 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。