title author date CreateTime categories
wpf 如何使用 Magick.NET 播放 gif 图片
lindexi
2018-2-13 17:23:3 +0800
2018-2-13 17:23:3 +0800
WPF gif

本文告诉大家使用 Magick.NET 的方法播放 gif 图片。

最近在做 gif 播放,发现 gif 播放需要很多内存,于是就使用 Magick.NET 播放,但是这个方式也需要很多的内存。播放一张 uwp 萤火虫 需要 600 M 内存。但是我还是把方法记下。

安装 Magick.NET

可以选择的很多,如果只是做测试,那么建议直接使用 AnyCPU 这样就不需要关心在哪里使用。里面的选项 Qn中的n就是表示质量,一般使用 8 就可以啦。

安装的方法建议使用 nuget 下载,nuget 可以使用国内博客园的源,当然现在大法更新了速度,安装也不难。

解析 gif

安装完成之后就可以使用,不过使用之前需要先设置缓存MagickAnyCPU.CacheDirectory,然后进行解析gif。关于解析参见:WPF 一个性能比较好的 gif 解析库 - 林德熙,这篇文章的解析只能播放常规的 gif ,对于压缩的 gif 是无法进行播放的,如果需要播放压缩后的 gif 那么需要使用 Coalesce ,一旦使用了就需要大概800M的内存,虽然很快就gc了。

常规 gif 图是直接把图片存放,对于这个文件,只需要把他分为多个 图片播放出来就好,需要注意就是他的图片时间,多久才继续播放。解析这个格式很简单,还可以使用大法的[wpf GifBitmapDecoder 解析 gif 格式(https://lindexi.github.io/lindexi/post/wpf-GifBitmapDecoder-%E8%A7%A3%E6%9E%90-gif-%E6%A0%BC%E5%BC%8F.html )

压缩的 gif 是把两个图片,判断这张图片有哪些像素和上一张一样,如果存在,就忽略。这个算法可以减少图片的空间。但是解析难度有些大,因为需要获得播放的上一个图片才可以进行解析这一张图片。

本文的解析gif 方法已经在WPF 一个性能比较好的 gif 解析库 - 林德熙讲到,下面就是代码。

            collection = new MagickImageCollection(File);

播放 gif

这次播放的方式不是使用 image,而是直接写一个底层的控件播放,请看代码

    public class SuxlzHjp : UIElement
{
public SuxlzHjp()
{
MagickAnyCPU.CacheDirectory = "E:\\temp";
} public void Play()
{
if (string.IsNullOrEmpty(CacheDirectory))
{
CacheDirectory = Path.Combine(Environment.CurrentDirectory, "temp");
}
if (!Directory.Exists(CacheDirectory))
{
Directory.CreateDirectory(CacheDirectory);
}
MagickAnyCPU.CacheDirectory = CacheDirectory; collection = new MagickImageCollection(File); int n = 0;
Task.Run(async () =>
{
while (true)
{
if (n == collection.Count)
{
n = 0;
} var t = collection[n];
var delay = t.AnimationDelay * 10; await Dispatcher.InvokeAsync(() =>
{
var width = t.Width;
var height = t.Height;
RenderTargetBitmap image = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
image.Render(drawing);
using (var drawingContext = drawing.RenderOpen())
{
drawingContext.DrawImage(image, new Rect(0, 0, width, height));
drawingContext.DrawImage(t.ToBitmapSource(),
new Rect(t.BoundingBox.X, t.BoundingBox.Y, t.BoundingBox.Width, t.BoundingBox.Height));
}
InvalidateVisual();
}); await Task.Delay(delay);
n++;
}
});
} public static readonly DependencyProperty FileProperty = DependencyProperty.Register(
nameof(File), typeof(string), typeof(SuxlzHjp), new PropertyMetadata(default(string))); public static string CacheDirectory { get; set; } public string File
{
get => (string) GetValue(FileProperty);
set => SetValue(FileProperty, value);
} protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawDrawing(drawing.Drawing);
base.OnRender(drawingContext);
} private DrawingVisual drawing = new DrawingVisual(); private MagickImageCollection collection;
}

可以尝试这个类进行播放,使用方法是设置 File 然后Play,可以看到这个方法需要使用的内存有 600M ,还不停gc所以这个方式不是我推荐。

其他播放gif的方法请看WPF 播放 gif

2018-2-13-wpf-如何使用-Magick.NET-播放-gif-图片的更多相关文章

  1. (转)新手C#SQL语句的学习2018.08.13

    1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...

  2. WPF设置VistualBrush的Visual属性制作图片放大镜效果

    原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...

  3. wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

    原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依 ...

  4. 在WPF设计工具Blend2中制作立方体图片效果

    原文:在WPF设计工具Blend2中制作立方体图片效果 ------------------------------------------------------------------------ ...

  5. WPF 后台C#设置控件背景图片

    原文:WPF 后台C#设置控件背景图片 以前的程序中有做过,当时只是记得uri很长一大段就没怎么记.今天有人问了也就写下来.   这是一个Button,设置了Background后的效果. 前台的设置 ...

  6. 2018.6.13 Java语言基础复习总结

    Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合.机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计 ...

  7. 2018/2/13 ElasticSearch学习笔记三 自动映射以及创建自动映射模版,ElasticSearch聚合查询

    终于把这些命令全敲了一遍,话说ELK技术栈L和K我今天花了一下午全部搞定,学完后还都是花式玩那种...E却学了四天(当然主要是因为之前上班一直没时间学,还有安装服务时出现的各种error真是让我扎心了 ...

  8. 【2018.08.13 C与C++基础】C++语言的设计与演化读书笔记

    先占坑 老实说看这本书的时候,有很多地方都很迷糊,但却说不清楚问题到底在哪里,只能和Effective C++联系起来,更深层次的东西就想不到了. 链接: https://blog.csdn.net/ ...

  9. 【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现

    一.前言 最近在做Matalb/Simulink与C/C++的混合编程,主要是完成TCP.UDP.SerialPort等常见通信方式的中间件设计,为Simulink模型提供数据采集及解析模块. 问题在 ...

  10. Practical Node.js (2018版) 13章, Node HTTP/2 Servers

    新增的章节. If you are not using HTTP/2, then you are losing out on big improvements. HTTP/2相比http/1有很大的区 ...

随机推荐

  1. 微信公众号 SVG长按互动

    <section class="" style="display: block;width: 100%;height:667px;overflow:hidden;m ...

  2. htaccess apache重定向学习

    1.推荐博客:http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html 2.测试工具:https://htaccess.madewi ...

  3. memcache课程---4、php+memcache如何让用户跨域登录

    memcache课程---4.php+memcache如何让用户跨域登录 一.总结 一句话总结: 让所有服务器共用一台memcache缓存,即可达到跨域的目的 1.session跨域:修改php配置文 ...

  4. 菜鸟nginx源码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)[转]

    菜鸟nginx源码剖析数据结构篇(七) 哈希表 ngx_hash_t(下) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...

  5. ansible 安装 使用 命令 笔记 生成密钥 管控机 被管控机 wget epel源

      ansible 与salt对比 相同 都是为了同时在多台机器上执行相同的命令 都是python开发 不同 agent(saltstack需要安装.ansible不需要) 配置(salt配置麻烦,a ...

  6. flock文件锁的学习和应用

    flock文件锁 学习与应用  2016-9-20 作用: 可以使用flock文件锁,避免指定命令的同时执行.(实现任务锁定,解决冲突) 用法: # flock -xn /opt/lock_file ...

  7. linux最基础最常用的命令快速手记 — 让手指跟上思考的速度(三)

    这一篇作为姐妹篇的第三篇,废话不多说,我觉得这个比mysql的还要重要,为什么,一旦你摊上linux 敲键盘输入命令简直是要飞的速度,不断的卡壳查命令,效率太低了,而且非常严重的影响思绪,思绪! 某些 ...

  8. <每日一题>题目7:简单的学生管理系统V1.0

    ''' # 学生管理系统v1.0 # 添加学生的信息 # 删除学生的信息 # 修改学生的信息 # 查看学生的信息 #遍历学生的信息 #退出系统 ''' import json #1 显示操作功能 de ...

  9. C#生成指定范围内的不重复随机数

    C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number ...

  10. ES6之主要知识点(二) 变量的解构赋值。默认值

    引自http://es6.ruanyifeng.com/#docs/destructuring 数组解构赋值 默认值 对象解构赋值 用途 1.数组的解构赋值 let [a, b, c] = [1, 2 ...