在UWP應用中實現Gif播放

 衆所周知,在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中看到,本文暫時不介紹具體的實現原理,下一次我會和你們詳細介紹,若是在使用中遇到問題,歡迎留言。性能

相關文章
相關標籤/搜索