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. NX二次开发-UFUN获取对象的显示属性(图层,颜色,空白状态,线宽,字体,高亮状态)UF_OBJ_ask_display_properties

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> UF_initialize( ...

  2. 2、http请求与http响应

    我们在接口测试过程中,可能会用http协议,webservice协议,当然用的较多的还是http协议,webservice协议在此不做过多介绍,我们先了解一下http协议,然后重点介绍http请求与响 ...

  3. 关于Mysql分区和分表

    [分区概念]分区就是把一张表的数据按照一定的规则分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上.分区后表还是一张表.分区根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.pa ...

  4. 好消息:Dubbo & Spring Boot要来了

    Duboo和Spring Boot都是非常优秀的框架,现在它们要结合了.为了简化Dubbo开发集成,阿里Dubbo团队将发布基于Spring Boot的版本,可快速上手Dubbo的分布式开发,并提供了 ...

  5. C++之变量

    变量 **作用**:给一段指定的内存空间起名,方便操作这段内存 **语法**:数据类型 变量名 = 初始值; 语法:数据类型  变量名 = 初始值;   记得加英文分号结束语句 > 注意:C++ ...

  6. 1-MySQL高级-视图

    视图 1. 问题 对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦 解决办法:定义 ...

  7. NOIP提高真题整理(2011-2018)-标签

    加粗的后面应该会有相应的简单解析(如果没咕的话:)). 2011 day1 T1:铺地毯:逆着铺 T2:选择客栈:按颜色分类枚举+二分答案 T3:Mayan游戏:大模拟dfs+剪枝 day2 T1:计 ...

  8. 【JZOJ6273】欠钱

    description analysis 读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值 那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲 明显\(LC ...

  9. SpringCloudBus

    不重启微服务的情况下更新配置 配置服务端 tensquare_config配置依赖 <dependency> <groupId>org.springframework.clou ...

  10. 共享商业&技术红利,阿里云SaaS加速器让天下没有难做的SaaS

    9月26日,阿里云在2019杭州云栖大会上发布了SaaS加速器3.0版“一云多端”多个应用平台,展示了阿里云给伙伴带来的多种商业和技术红利.阿里云SaaS加速器将帮助伙伴做好SaaS,卖好SaaS:帮 ...