众所周知,在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. Centos6.5 下安装PostgreSQL9.4数据库

    一.安装PostgreSQL源 CentOS 6.x 32bit rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-i386/pgdg-cent ...

  2. JsCss笔记

    1.  &= 不应该在 Bool 型变量中使用. a &= b  对于Js来说是:  a = a & b ;  a 本来是 bool , &= 之后就变成了 Int. ...

  3. C语言 栈 顺序结构 实现

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译). /** * @brief C语言实现的顺序结构类型的栈 * @author wid * @date 2013-10-29 * ...

  4. 仿花田:内部相亲网站 意中人(Asp.net MVC,Bootstrap2)

    起因: 那是七月份了,看见单身的同事在上花田网,当时觉得风格比较清新,还没有世纪佳缘等那些网站那么商业化,加上又看到了bootrstrap,于是就想做个demo出来玩玩.中间自己又在做其他的事情,和w ...

  5. [MFC] MFC 获取指定窗口截图(大小可调)

    void screenShot(CRect rect,int left,int top,char *name){//截取窗口的大小,位置,名字(保存在默认路径下) CBitmap* m_pBitmap ...

  6. paip.日期时间操作以及时间戳uapi php java python 总结

    paip.日期时间操作以及时间戳uapi php java python 总结 ///uapi Date 函数 | Day 函数 | Hour 函数 | Minute 函数 | Month 函数 | ...

  7. JAVA实现多线程入门

    package com.thread;/** * 1:程序员可以在程序中执行多个线程,每一个线程完成一个功能,并于其他线程并发执行,这种 * 机制被称为多线程 * 2:实现线程的两种方法是,分别是继承 ...

  8. web前端基础——jQuery编程进阶

    1 jQuery本质 jQuery不是一门独立的语言,它是JavaScript的一个类库或框架.jQuery的核心思想就是:选取元素,对其操作.很多时候写jQuery代码的关键就是怎样设计合适的选择器 ...

  9. This in JavaScript

    声明 本文仅为读书笔记并致力于理解Js中的this关键字.如有雷同,纯属巧合.原因有二,其一:有幸看了同一本书,其二:this这玩意已被说烂了~ 为什么要用this? this提供了优雅的方式隐式传递 ...

  10. 关于C++单件模式释放对象

    http://blog.csdn.net/windboyzsj/article/details/2790485 最近接触的一个项目要用到单件模式,我像往常一样哒哒(敲击键盘ing)一个单件模式的典型结 ...