众所周知,在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. couchbase作为分布式session容器时的注意事项

    在开发MVC程序时,选择了couchbase作为session provider,但在部署的过程当中发现,两台web server负载均衡,只有一台有session,而负载到另外一台web serve ...

  2. 记一次在StackOverFlow上问问题的经历

    最近一直在做测试方面的事情,被测的一些功能需要连接到FTP服务器上.而我在做本地测试时为了方便,就使用java写了一个简单的ftp服务器,可以在命令行下直接启动运行. 当时在main函数里是这样写的. ...

  3. chosen PersistenceUnitInfo does not specify a provider class name

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceI ...

  4. Redis教程(十):持久化详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化 ...

  5. crossplatform---Nodejs in Visual Studio Code 10.IISNode

    1.开始 Nodejs in Visual Studio Code 08.IIS : http://www.cnblogs.com/mengkzhaoyun/p/5410185.html 参考此篇内容 ...

  6. 安装 Autoconf 2.69版

    发生错误configure.ac:8: error: Autoconf version 2.64 or higher is required 1.检查版本 [root@localhost Deskto ...

  7. Sencha Toucha 2 —1.环境安装配置、在线打包、离线打包

    环境安装配置        1. 下载 1.1     Sencha Touch 下载 http://cdn.sencha.com/touch/sencha-touch-2.2.1-gpl.zip 1 ...

  8. 混合使用Jquery Deferred和Angularjs的$timeout(转)

    原文链接:http://my.oschina.net/gejiawen0913/blog/174826 <!DOCTYPE html> <html ng-app="Demo ...

  9. IntelliJ IDEA 2016.2.4 最新版激活方法

    新版激活方法: 1.在线激活 2016年7月14日 更新: 该域名已无法激活,参见2016.2 的搭建授权服务器激活, 菜单help >>>> Register 选择Licen ...

  10. quartzScheduler_Worker-1] but has failed to stop it. This is very likely to create a memory leak解决

    01-Jul-2016 07:24:20.218 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 80 ...