title author date CreateTime categories
WPF 一个性能比较好的 gif 解析库
lindexi
2019-08-30 08:59:45 +0800
2018-2-13 17:23:3 +0800
WPF gif

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

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

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

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

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

使用Nuget安装之后就可以使用,例如需要播放 E:\temp\2017年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博客

2019-8-30-WPF-一个性能比较好的-gif-解析库的更多相关文章

  1. WPF 一个性能比较好的 gif 解析库

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

  2. 2019.8.30 记录一个Swiper的使用

    导入     flutter_swiper: ^1.1.6 引入     import 'package:flutter_screenutil/flutter_screenutil.dart'; 已下 ...

  3. WPF 一个简单的颜色选择器

    原文:WPF 一个简单的颜色选择器 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/8340999 ...

  4. 《MySQL必知必会》学习笔记——第30章 改善性能

    本章将付息与MySQL性能有关的某些要点. 30.1 改善性能 数据库管理员把他们生命中的相当一部分时间花在了调整.试验以改善DBMS性能之上.在诊断英勇的滞缓现象和性能问题时,性能不良的数据库(以及 ...

  5. 最优化WPF 3D性能(基于“Tier-2”硬件)

    原文:最优化WPF 3D性能(基于"Tier-2"硬件) 原文地址:Maximizing WPF 3D Performance on Tier-2 Hardware 开发人员在应用 ...

  6. C# WPF 一个设计界面

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF 一个设计界面 今天正月初三,大家在家呆着挺好,不要忘了自我充电. 武汉人民加油, ...

  7. 2019.3.28&2019.3.30考试

    2019.3.28 : 肥肠爆芡,因为这场考试的题太屑了,所以我咕咕了 Upd on 2019.3.30 压进来一篇(因为都没啥意义) 2019.3.30 : 全机房读错题+没有大样例=T2全体爆炸 ...

  8. 一个性能较好的JVM参数配置

    一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...

  9. 一个性能较好的JVM参数配置(转)

    一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...

随机推荐

  1. 秒懂神经网络---BP神经网络具体应用不能说的秘密.

    秒懂神经网络---BP神经网络具体应用不能说的秘密 一.总结 一句话总结: 还是要上课和自己找书找博客学习相结合,这样学习效果才好,不能单视频,也不能单书 BP神经网络就是反向传播神经网络 1.BP神 ...

  2. Detours的使用准备

    Detours是微软开发的一个函数库,可用于捕获系统API.在用其进行程序开发之前,得做一些准备工作: 一.下载Detours 在http://research.microsoft.com/sn/de ...

  3. kafka集群配置总结

    虽然很简单,但会遇到很多奇怪的坑,而且网上解决方法搜不到. 首先下载kafka包,解压缩后,修改conf/server.properties文件,基本配置项如下(省略了部分默认配置项 : broker ...

  4. 剑指offer——02二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  5. 【LGP5127】子异和

    题目 子异和这个名字,真是思博 显然一个集合的子集异或和为,\(2^{|S|-1}\times A\),\(A\)为集合的或和 于是现在的问题变成了树链异或一个数,求树链或和 显然强行拆位是可以做的, ...

  6. 安装go环境

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~go项目运行时的依赖包安装问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~1.安装go环境 wget https://dl.goog ...

  7. JS关闭当前父级div

    代码: <img src="img/diagram.png" onclick="javascript:this.parentNode.parentNode.remo ...

  8. mysql 复制原理详解

    http://www.cnblogs.com/kristain/articles/4142970.html

  9. pipenv的使用

    首先,确保pip install pipenv已经安装 1.新建一个文件夹,并在地址栏输入cmd,回车. 2.输入pipenv install,等待虚拟环境搭建完毕. 3.输入pipenv shell ...

  10. Html标签学习笔记二

    1.常用标签 <a></a>超链接    功能    做链接 :在href属性里面写明指向的地方        做下载:href指向文件(注意:不能下载的文件是因为浏览器可以直 ...