在UWP应用中实现Gif播放

 众所周知,在UWP应用框架中,Image控件是无法播放GIF的图片,只能显示静态图,这样的体验不是特别友好。我在Win8、WP8.1的时候实现过gif播放功能,但是最近发现性能和播放效果都差强人意,大家可以看我的贴吧应用,目前还是用我以前写的gif控件,一些图片播放效果并不是很正确,或者内存消耗过高,主要原因是因为只对gif每帧做了简单的处理。

 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播放,所以之前做了一些取舍。

    时过境迁,前一段时间知道微软发布了win2d的图形加速引擎后,就特别感兴趣,看到微软用win2d实现了gif的播放demo,做了一些研究,将微软的播放demo做了一些改进,开发了uwp的图片框架ImageLib.UWP,该项目已经发布到Github中(https://github.com/chenrensong/ImageLib.UWP),同时也在nuget上发布了最新版本,大家可以通过

Install-Package ImageLib.UWP

命令来安装。

    ImageLib.UWP支持几乎所有的uri格式,借鉴了众多图片框架的优势,支持扩展图片解析器,这部分大家可以在demo中看到,本文暂时不介绍具体的实现原理,下一次我会和大家详细介绍,如果在使用中遇到问题,欢迎留言。

 

posted on 2015-10-12 17:36  豆浆咖啡  阅读(2148)  评论(2编辑  收藏  举报