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

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

  1. Viewbox在UWP开发中的应用

    Windows 8.1 与Windows Phone 8.1的UAP应用,终于在Windows 10上统一到了UWP之下.原来3个不同的project也变为一个.没有了2套xaml页面,我们需要用同一 ...

  2. UWP开发中的方向传感器

    在UWP开发中,我们能使用的到方向有三种: OrientationSensor下的四元数:Compass罗盘的HeadingMagneticNorth:以及SimpleOrientationSenso ...

  3. 13、在 uwp应用中,给图片添加高斯模糊滤镜效果(一)

    如果在应用中,如果想要给app 添加模糊滤镜,可能第一想到的是第三方类库,比如 Win2d.lumia Imaging SDK .WriteableBitmapEx,不可否认,这些类库功能强大,效果也 ...

  4. Wpf中MediaElement循环播放

    原文:Wpf中MediaElement循环播放 前一段时间做了一个项目,里面牵涉到媒体文件的循环播放问题,在网上看了好多例子,都是在xaml中添加为MediaElement添加一个TimeLine,不 ...

  5. MFC中使用SDL播放音频没有声音的解决方法

    本文所说的音频是指的纯音频,不包含视频的那种. 在控制台中使用SDL播放音频,一般情况下不会有问题. 但是在MFC中使用SDL播放音频的时候,会出现没有声音的情况.经过长时间探索,没有找到特别好的解决 ...

  6. Android中的Audio播放:竞争Audio之Audio Focus的应用

    from://http://blog.csdn.net/thl789/article/details/7422931 Android是多任务系统,Audio系统是竞争资源.Android2.2之前,没 ...

  7. Windows10(uwp)开发中的侧滑

    还是在持续的开发一款Windows10的应用中,除了上篇博客讲讲我在Windows10(uwp)开发中遇到的一些坑,其实还有很多不完善的地方,比如(UIElement.Foreground).(Gra ...

  8. 使用Win2D在UWP程序中2D绘图(一)

    在新的Windows UWP程序中,引入了一个新的API库: Win2D.它是一个d2d的封装,可以直接使用C#来快速实现高效2D绘图了.这个API虽然在Win8.1时代就开始着手开发了,但最近才完善 ...

  9. EasyDSS RTMP流媒体服务器中调用videojs播放rtmp视频显示在左上角问题

    本文转自EasyDarwin团队成员Penggy的博客:http://www.jianshu.com/p/f63f5b7c691b 问题描述: 近期我开发了一款新一代的RTMP/HLS流媒体服务器软件 ...

随机推荐

  1. [Xamarin] 透過WebClient跟網路取得資料 (转帖)

    之前寫過一篇文章,關於在Android上面取得資料 透過GET方式傳資料給Server(含解決中文編碼問題) 我們來回顧一下 Android 端的Code: 有沒有超多,如果是在Xaramin下面,真 ...

  2. 设计模式之美:Facade(外观)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统. 意图 为子系统中的一组接口提供一个一致的界面,Facade 模式定义了 ...

  3. 用SQL语句断开某个数据库的所有活动连接

    每次一执行完一个数据库脚本,想要做一些别的操作的时候(比如还原数据库),老是有数据库活动连接,烦不胜烦(如下图所示). 下面给出一种删除数据库活动连接的方式.将下面代码段中的“--修改一下”处的数据库 ...

  4. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...

  5. paip.java swt 乱码问题解决

    paip.java swt 乱码问题解决 看累挂,Dfile.encoding是gbk的.. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专 ...

  6. atitit 提升数据库死锁处理总结

    atitit 提升数据库死锁处理总结 正常的来说,锁上都是自动的..不用官.. 正常来讲,insert时不需要加rowlock,就默认是rowlock了, #-----锁的自动转换原理.(正常的不用理 ...

  7. JS open App(未安装就跳转下载页面)

    直接上代码var APPCommon = { downAppURl : "http://**/",//下载APP地址 downWeixin: "http://**&quo ...

  8. Spring简介和基础

    Spring介绍 1.什么事Spring? spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. spring的设计模式是单例模式和工厂模式. 2.spring的四大优点 轻量 ...

  9. CSS揭秘读书笔记 (一)

    CSS揭秘读书笔记      (一) 一.半透明边框 要想实现半透明边框可以使用border: border: 10px  solid  hsla(0,0%,100%,.5); background: ...

  10. 在ArcGIS空间数据库中增加点数据的方法

    1.新建一个mxd(ArcMAP)文件 2.从ArcCatalog中把要编辑的图层拖到ArcMAP中 3.从ArcCatalog中拖一个参照图层到ArcMAP中,比如临沂市的县级区划图 4.打开Edi ...