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. DuiLib学习笔记2.写一个简单的程序

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  2. 第十二章 Odoo 12开发之报表和服务端 QWeb

    报表是业务应用非常有价值的功能,内置的 QWeb 引擎是报表的默认引擎.使用 QWeb 模板设计的报表可生成 HTML 文件并被转化成 PDF.也就是说我们可以很便捷地利用已学习的 QWeb 知识,应 ...

  3. 给自己立下一个flag先

    恩,今天开始写博客. 其实主要原因是被人甩了,想找个事情让自己忙起来. 主要原因是“男人没钱就是无能”,我是个应届毕业生.所以你懂的. 我不喜欢让心情不爽,所以只能找事情让自己忙起来.所以我开始立Fl ...

  4. java浮点运算的陷阱

    首先呢,i你要明白double和float. Inifinity: 例如:syso(5.0/0.0+" 和"+0.0 /0.0); 浮点运算的0.0不是真正意义上的0,而是非常接近 ...

  5. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

  6. Codeforces-348E Pilgrims

    #4342. CF348 Pilgrims 此题同UOJ#11 ydc的大树 Online Judge:Bzoj-4342,Codeforces-348E,Luogu-CF348E,Uoj-#11 L ...

  7. CSP-S模拟41影子,玫瑰花精题解

    题面:https://www.cnblogs.com/Juve/articles/11523567.html 影子: 暴力方法:枚举每一对点暴力统计最小权 优化:考虑并查集,枚举每个点,如果没有被访问 ...

  8. LA4794 Sharing Chocolate

    传送门 记忆化搜索. 在下觉得sxy大佬的代码写得相当好,通篇的骚操作(因为我都不会呀),%%% 学到了 预处理每个状态的值.以前的我都是zz地枚举每一位.. for(int i=1;i<(1& ...

  9. win 7下安装mysql zip格式

    mysql 下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads 下载的mysql格式为zip: 下载完成放在除C盘以外的盘. 一 ...

  10. c语言学习笔记 函数数组传递笔记

    今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...