在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中看到,本文暂时不介绍具体的实现原理,下一次我会和大家详细介绍,如果在使用中遇到问题,欢迎留言。

时间: 2024-10-25 00:24:28

在UWP应用中实现Gif播放的相关文章

[UWP]在UWP平台中使用Lottie动画

原文:[UWP]在UWP平台中使用Lottie动画 最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lottie动画实现的! 这让我大为惊奇,我对Lottie了解还算是比较多的,但是Lottie常见应用于移动端APP和网页,在传统桌面端见到还是第一次. 那就趁这个机会,来分享点关于Lottie动画的东西吧! Lottie动画的UWP实现 Lottie是

【转载】关于C#中声音的播放

转自 http://www.cnblogs.com/chenjiahong/articles/2716552.html C#中声音的播放主要有三种方法: 1.使用API函数. 2.使用SoundPlayer类播放. 3.使用DirectX进行播放. 一.使用API函数进行播放 windows操作系统中的winmm.dll文件中封装了声音处理的函数.在C#中我们可以通过平台调用的方式使用这里边的API函数来播放声音. 下边的类中使用了PlaySound.sndPlaySound.mciSendSt

Windows10(uwp)开发中的侧滑

还是在持续的开发一款Windows10的应用中,除了上篇博客讲讲我在Windows10(uwp)开发中遇到的一些坑,其实还有很多不完善的地方,比如(UIElement.Foreground).(GradientBrush.GradientStops)[1].(GradientStop.Offset)这种设置无法生效,还有RelativePanel内的元素不能自动的适应大小,要去手动控制宽高度,以及窗口在靠边的时候一些尺寸上的错误等等.虽然是WPF技术之后的延续,但是很多地方还是要小心仔细的处理,

Android平台中关于音频播放

Android平台中关于音频播放有以下三种方式: 1.SoundPool ---- 适合短促且对反应速度比较高的情况(游戏音效或按键声等) 2.MediaPlayer ---- 适合比较长且时间要求不高的情况 3.AudioTrack ---- 播放解码后的PCM码流 方法一:SoundPool 1)SoundPool简介 SoundPool类是Android用于管理和播放应用程序的音频资源的类.一个SoundPool对象可以看作是一个可以从APK中导入资源或者从文件系统中载入文件的样本集合.它

对于微信内置浏览器中不能小窗播放视频原因的分析以及解决

菜鸟:微信内置浏览器中不能小窗播放视频肿么办??? 师傅:徒弟莫猴急,待师傅一一道来:首先,喺发生急事嘅情况下,我哋最要保持冷静,噉才可以施展出一个有思维.有智慧.有头脑嘅人,应该有嘅气质与才华. 菜鸟:哇,知啦,跟住我应该点做哩? 师傅:求百度啊!!!!!! ......以上是背景......以下是根据百度爬到的内容进行的分析与总结...... 分析webkit-playsinline为什么不能在微信内核中起作用的原因: 1:在不考虑微信内核的浏览器中用html5的video方式播放视频时:在

驳Linux不娱乐 堪比Win平台中十款播放器

驳Linux不娱乐 堪比Win平台中十款播放器 1.VLC多媒体播放器     VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器.它支持众多音频与视频解码器及档案格式,并支持 DVD.VCD的播放及各类串流协议.它亦能作为unicast和multicast的串流服务器在IPv4以及IPv6的高速网络连线下使用.它融合了 FFmpeg出品的解码器与libdvdcss程序库,这更使其增添了播放多媒体档案及加密DVD影碟的功能. VLC多媒体播放器具有跨平台的

Wpf中MediaElement循环播放

原文:Wpf中MediaElement循环播放 前一段时间做了一个项目,里面牵涉到媒体文件的循环播放问题,在网上看了好多例子,都是在xaml中添加为MediaElement添加一个TimeLine,不符合我的项目需求,就自己想了一个办法,基本的思路就是在媒体播放完毕后再次Play一下就OK了,废话不多说,首先Show一下我的代码吧: 写一个方法用来动态创建一个MediaElement:这里的ScreenModel是我创建的一个类,大家根据需要可以修改 MediaElement MediaElem

在 UWP 应用中创建、使用、调试 App Service (应用服务)

在 Windows 10 中微软为 UWP 引入了 App Service (即应用服务)这一新特性用以提供应用间交互功能.提供 App Service 的应用能够接收来自其它应用传入的参数进行处理后返回数据. 创建应用服务 要使应用支持提供 App Service 非常简单.只需正确配置应用的清单文件后添加服务相关的代码即可. 配置应用清单文件 打开项目中的 Package.appxmanifest 文件. 切换到 Declarations 选项卡. 在左侧 Available Declara

如何在asp.net中如何在线播放各类视频文件

一.后台拼字符串动态加载写法 前台调用代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < html xmlns="http://www.w3.org/1999/xhtml" > < head id="Head