在UWP应用中实现Gif播放

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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上发布了最新版本,大家可以通过

1
Install-Package ImageLib.UWP

命令来安装。

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

 

posted on   豆浆咖啡  阅读(2157)  评论(2编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示