zoukankan      html  css  js  c++  java
  • WPF 一个性能比较好的 gif 解析库

    本文介绍 Magick.NET ,这是 ImageMagick 的 .Net 封装,他支持 100 多种格式的图片,而 gif 也是他支持的。本文告诉大家如何使用这个库播放 gif 图

    先给大家看一下播放下面这个图片需要的内存。

    这个库的好处是可以在解析的时候使用比较多的内存,解析完成就不需要那么多的内存。而其他的库解析或播放都需要很多内存。从上面的图看到,解析图片需要使用800M内存,解析完成需要200M内存,有很多资源都被释放。

    下面告诉大家如何使用这个库。

    使用 Nuget 搜索 Magick.NET 就可以找到。如果看到了很多版本,不要害怕。这个库需要说明是哪个版本,其中Qn就是表示质量,推荐使用Q8,而这个库需要指定cpu,于是就可以找到需要的库。

    使用Nuget安装之后就可以使用,例如需要播放 E: emp2017年9月1日 16.gif 那么需要写一个Image控件和在后台写很少代码。

            <Image x:Name="G"></Image>
    
    

    后台需要使用collection = new MagickImageCollection(str)获得文件,然后使用ToBitmapSource获得图片。使用之前需要给缓存文件夹MagickAnyCPU.CacheDirectory = "E:\temp";

              string str = "E:\temp\2017年9月1日 16.gif";
    
                var image = new List<BitmapSource>();
                using (collection = new MagickImageCollection(str))
                {
                    collection.Coalesce();
                    foreach (var magickImage in collection)
                    {
                        image.Add(magickImage.ToBitmapSource());
                    }
                }
    

    接下来就是播放图片,使用一个循环播放

               Task.Run(async () =>
                {
                    while (true)
                    {
                        await Dispatcher.InvokeAsync(() =>
                        {
                            G.Source = image[n];
                        });
                        n++;
                        if (n == image.Count)
                        {
                            n = 0;
                        }
    
                        await Task.Delay(100);
                    }
                });
    

    运行就可以看到,播放图片。就是上面的截图。但是程序有小问题,就是没有拿到图片播放间隔,这个可以通过 magickImage.AnimationDelay拿到,这个数是 1/100 秒,所以一般使用 *10 结果是毫秒 。

    一般在使用ToBitmapSource需要使用AdaptiveResize这个方法可以让gif显示播放的图片大小,使用这个函数可以获得比较少的内存。

    于是播放 gif 的代码很简单,打开 gif ,解析,播放。

              string str = "E:\temp\2017年9月1日 16.gif";
    
                var image = new List<(BitmapSource image,int delay)>();
                using (collection = new MagickImageCollection(str))
                {
                    collection.Coalesce();
                    foreach (var magickImage in collection)
                    {
                        magickImage.AdaptiveResize(100,100);
                        image.Add((magickImage.ToBitmapSource(), magickImage.AnimationDelay * 10));
                    }
                }
                Task.Run(async () =>
                {
                    while (true)
                    {
                        await Dispatcher.InvokeAsync(() =>
                        {
                            G.Source = image[n].image;
                        });
                        n++;
                        if (n == image.Count)
                        {
                            n = 0;
                        }
    
                        await Task.Delay(image[n].delay);
                    }
                });
    

    我把最近写的 gif 使用方法写到一个博客,欢迎大家来看这个博客 WPF 播放 gif

    参见:水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码) - 毒逆天 - 博客园

    https://github.com/dlemstra/Magick.NET

    其他解析gif 的方法:【续】WPF支持GIF的各种方法 - CSDN博客

    WPF 如何显示gif - CSDN博客

    WPF播放GIF控件完整代码 - CSDN博客

    WPF中显示GIF图片 - CSDN博客

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    深入探讨this指针
    杂谈:你选择coco 还是unity3d?
    一分钟制作U盘版BT3
    【转载】ShowWindow函数
    hadoop备记
    OA系统权限管理设计(转载)
    二叉树的存储与遍历
    这难道是CSDN的BUG? 大家帮忙看看哪里有问题
    Cookie 操作工具类
    Java实现 蓝桥杯VIP 算法训练 数的统计
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086932.html
Copyright © 2011-2022 走看看