衆所周知,在UWP應用框架中,Image控件是沒法播放GIF的圖片,只能顯示靜態圖,這樣的體驗不是特別友好。我在Win八、WP8.1的時候實現過gif播放功能,可是最近發現性能和播放效果都差強人意,你們能夠看個人貼吧應用,目前仍是用我之前寫的gif控件,一些圖片播放效果並非很正確,或者內存消耗太高,主要緣由是由於只對gif每幀作了簡單的處理。git
var frame = await decoder.GetFrameAsync(frameIndex).AsTask(token); var writeableBitmap = new WriteableBitmap((int)decoder.OrientedPixelWidth, (int)decoder.OrientedPixelHeight); BitmapFrame bframe = await decoder.GetFrameAsync(frameIndex).AsTask(token); TimeSpan delay = TimeSpan.Zero; BitmapPropertySet bitmapPropertySet = await bframe.BitmapProperties.GetPropertiesAsync(new List<string>()).AsTask(token); if (bitmapPropertySet != null) { BitmapPropertySet delayPropertySet = await (bitmapPropertySet["/grctlext"].Value as BitmapPropertiesView).GetPropertiesAsync(new List<string> { "/Delay", }); if (delayPropertySet != null) { delay = TimeSpan.FromSeconds(double.Parse(delayPropertySet["/Delay"].Value.ToString()) / 100.0); } } if (delay.Equals(TimeSpan.Zero)) { delay = DefaultDelay; } var bitmapTransform = new BitmapTransform(); var pixelDataProvider = await frame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, decoder.BitmapAlphaMode, bitmapTransform, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage); var pixels = pixelDataProvider.DetachPixelData(); using (var bitmapStream = writeableBitmap.PixelBuffer.AsStream()) { bitmapStream.Write(pixels, 0, pixels.Length); }
這段代碼,能夠看出解析gif每幀沒有對gif的參數作處理,只處理了delay屬性,也就是每幀的播放間隔(這個播放間隔有個比較吭的地方,若是delay爲zero通常來講須要加上100毫秒,用於作間隔,不然gif會播放的過快),可是沒對其餘的圖片屬性作處理,致使一些gif樣式錯誤,可是這樣的實現相對來講比較簡單,性能效率什麼的會更高,並且能適應大部分的gif播放,因此以前作了一些取捨。github
時過境遷,前一段時間知道微軟發佈了win2d的圖形加速引擎後,就特別感興趣,看到微軟用win2d實現了gif的播放demo,作了一些研究,將微軟的播放demo作了一些改進,開發了uwp的圖片框架ImageLib.UWP,該項目已經發布到Github中(https://github.com/chenrensong/ImageLib.UWP),同時也在nuget上發佈了最新版本,你們能夠經過框架
Install-Package ImageLib.UWP
命令來安裝。ide
ImageLib.UWP支持幾乎全部的uri格式,借鑑了衆多圖片框架的優點,支持擴展圖片解析器,這部分你們能夠在demo中看到,本文暫時不介紹具體的實現原理,下一次我會和你們詳細介紹,若是在使用中遇到問題,歡迎留言。性能