2019-8-30-WPF-一个性能比较好的-gif-解析库
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博客
2019-8-30-WPF-一个性能比较好的-gif-解析库的更多相关文章
- WPF 一个性能比较好的 gif 解析库
本文介绍 Magick.NET ,这是 ImageMagick 的 .Net 封装,他支持 100 多种格式的图片,而 gif 也是他支持的.本文告诉大家如何使用这个库播放 gif 图 先给大家看一下 ...
- 2019.8.30 记录一个Swiper的使用
导入 flutter_swiper: ^1.1.6 引入 import 'package:flutter_screenutil/flutter_screenutil.dart'; 已下 ...
- WPF 一个简单的颜色选择器
原文:WPF 一个简单的颜色选择器 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/8340999 ...
- 《MySQL必知必会》学习笔记——第30章 改善性能
本章将付息与MySQL性能有关的某些要点. 30.1 改善性能 数据库管理员把他们生命中的相当一部分时间花在了调整.试验以改善DBMS性能之上.在诊断英勇的滞缓现象和性能问题时,性能不良的数据库(以及 ...
- 最优化WPF 3D性能(基于“Tier-2”硬件)
原文:最优化WPF 3D性能(基于"Tier-2"硬件) 原文地址:Maximizing WPF 3D Performance on Tier-2 Hardware 开发人员在应用 ...
- C# WPF 一个设计界面
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF 一个设计界面 今天正月初三,大家在家呆着挺好,不要忘了自我充电. 武汉人民加油, ...
- 2019.3.28&2019.3.30考试
2019.3.28 : 肥肠爆芡,因为这场考试的题太屑了,所以我咕咕了 Upd on 2019.3.30 压进来一篇(因为都没啥意义) 2019.3.30 : 全机房读错题+没有大样例=T2全体爆炸 ...
- 一个性能较好的JVM参数配置
一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...
- 一个性能较好的JVM参数配置(转)
一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...
随机推荐
- Ubuntu安装msf
环境 root运行 ubuntu18.04 腾讯云服务器 控制面板上面所有的端口全部放行 本机自带防火墙已拆 拆墙是为了能msf接受到会话 安装 curl https://raw.githubuser ...
- NX二次开发-UFUN获得边的类型UF_MODL_ask_edge_type
1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_modl.h> 6 #i ...
- NX二次开发-打开文件夹,并同时选中指定文件
NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_part.h> #include <at ...
- 牛客多校第九场 E All men are brothers 并查集/组合论
题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...
- 黑科技之杜教bm
这个板子能够解决任何线性递推式,只要你确定某个数列的某项只与前几项线性相关,那么把它前若干项丢进去,这个板子就能给你返回你要求的某项的值. 原理???(待补充) #include<bits/st ...
- Centos 6 & Centos 7安装rabbitmq3.6.15(单节点)
系统准备 安装 erlang 语言环境 安装rabbitmq 配置网页插件 配置访问账号密码和权限 系统准备 centos6.5 与 centos7 都可以 ###安装依赖文件 yum -y inst ...
- [转]C++ 使用Makefile文件
//*********list class.h**********class tdate {private:int month;int day;int year;public:tdate();tdat ...
- kafka 批量添加topic 副本数
shell 脚本: 1)列出只有一个副本的topic,保存到一个文件中: [root@hdp05 src]# cat fush.sh #!/bin/bash # topics=`/usr/hdp//k ...
- 使用SDK方式进行微信授权
1.在pom.xml中添加依赖 <dependency> <groupId>com.github.binarywang</groupId> <artifact ...
- 随笔-ansible-3
关于循环的一些事: 是否是因为模块的原因? item适用于copy,但不适用于yum.虽然出现了警告,但并不表示不能用.功能还是不受影响的. 在上例中,我们使用了yum.copy.service模块( ...