众所周知,在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中看到,本文暂时不介绍具体的实现原理,下一次我会和你们详细介绍,若是在使用中遇到问题,欢迎留言。性能