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. springboot下slf4j配置

    我们在引用的时候直接写 private static final Logger logger = LoggerFactory.getLogger(XXXServiceImpl.class); log. ...

  2. L2-006 树的遍历 (层序遍历)

    根据访问根节点与左右子树的先后顺序,二叉树一般有三种遍历方式:先序遍历.中序遍历和后序遍历. 只要给定中序遍历序列与先序或后序中的一种,可以还原二叉树结构.学习数据结构课程时,一直都只会手动构建还原二 ...

  3. PAT甲级——A1009 Product of Polynomials

    This time, you are supposed to find A×B where A and B are two polynomials. Input Specification: Each ...

  4. leetcode 996. Number of Squareful Arrays

    给定一个长度小于 12 的数组 要求排列方式的种数 使得相邻和为完全平方 不考虑数学结构 将问题转化为 一笔画问题 和为完全平方代表 之间存在通路 回溯法 N^N 记忆化搜索 NN 2^N 判断是否是 ...

  5. vue 实现单选框

    参考:https://blog.csdn.net/qq_42221334/article/details/81630634 效果: vue: <template> <div> ...

  6. OSG在VS2008下的配置安装

    一.准备工作 下载相关的工具软件: 1, 最新版的OSG库:OpenSceneGraph-2.8.2.zip. 2, 安装源代码所需要的工具:cmake-2.6.4-win32-x86.zip 3,  ...

  7. Ubuntu 14.04 Ruby 2.3.3 安装

    在Ubuntu 14.04通过下载Ruby源码包进行安装. 第一步,更新apt-get sudo apt-get update 通过apt-get安装ruby依赖 sudo apt-get insta ...

  8. 基于httpd2.2配置https

    本次演示使用一台主机实现,即自签自演 主机IP:192.168.1.105 开始配置: 1.创建私有CA # cd /etc/pki/CA # touch serial # touch index.t ...

  9. 如何解决mysql服务器load高

    .登录主机 # ssh hostname .确定是否是mysql导致 # top .查看是哪些sql正在慢查询 # mysql -h hostname -P port -u username # sh ...

  10. 全栈之路-微信小程序-SKU开发(代码)

    SKU开发是小程序中最难的一部分,思路在分析中已经记录过了,这里主要看一下代码的实现,感觉老师写的代码太棒了,很优雅!主要想记录一下写代码的思路,对面向对象编程的实践. 一.代码结构的分析 1.说明几 ...