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

  • 相关阅读:
    [功能发布]Excel与PowerBI互通互联升级版连接SSAS和AzureAS
    个人永久性免费-Excel催化剂功能第115波-word、pdf、Excel、ppt、html等文件互转
    个人永久性免费-Excel催化剂功能第113波-将帮助文档的主动权归还用户手中
    个人永久性免费-Excel催化剂功能第106波-重新定义使用Excel功能方式
    [功能发布]Excel催化剂2周年巨献-网页数据采集功能发布,满足90%合理场景使用
    Rabbitmq(一)
    Redis(三)
    MVC action过滤器验证登录
    分布式缓存 Redis(二)
    分布式缓存 Redis(一)
  • 原文地址:https://www.cnblogs.com/cracker/p/4872308.html
Copyright © 2011-2022 走看看