新建GifImage类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Interop;
using System.Windows.Threading;
using System.Runtime.InteropServices;
using System.Windows.Media.Imaging;
using System.Drawing;namespace WPF_DCStation_ZTE
{public class GifImage : System.Windows.Controls.Image{/// <summary>/// gif动画的System.Drawing.Bitmap/// </summary>private Bitmap gifBitmap;/// <summary>/// 用于显示每一帧的BitmapSource/// </summary>private BitmapSource bitmapSource;public GifImage(string path){this.gifBitmap = new Bitmap(path);this.bitmapSource = this.GetBitmapSource();this.Source = this.bitmapSource;}/// <summary>/// 从System.Drawing.Bitmap中获得用于显示的那一帧图像的BitmapSource/// </summary>/// <returns></returns>private BitmapSource GetBitmapSource(){IntPtr handle = IntPtr.Zero;try{handle = this.gifBitmap.GetHbitmap();this.bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());}finally{if (handle != IntPtr.Zero){DeleteObject(handle);}}return this.bitmapSource;}/// <summary>/// Start animation/// </summary>public void StartAnimate(){ImageAnimator.Animate(this.gifBitmap, this.OnFrameChanged);}/// <summary>/// Stop animation/// </summary>public void StopAnimate(){ImageAnimator.StopAnimate(this.gifBitmap, this.OnFrameChanged);}/// <summary>/// Event handler for the frame changed/// </summary>private void OnFrameChanged(object sender, EventArgs e){Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>{ImageAnimator.UpdateFrames(); // 更新到下一帧if (this.bitmapSource != null){this.bitmapSource.Freeze();}Convert the bitmap to BitmapSource that can be display in WPF Visual Treethis.bitmapSource = this.GetBitmapSource();Source = this.bitmapSource;this.InvalidateVisual();}));}/// <summary>/// Delete local bitmap resource/// Reference: http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx/// </summary>[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]static extern bool DeleteObject(IntPtr hObject);}
}

窗体加载事件

或者使用相对路径

//string path = AppDomain.CurrentDomain.BaseDirectory + "Loading.gif";

private GifImage gifImage;private void Grid_Loaded(object sender, RoutedEventArgs e){this.gifImage = new GifImage(@"E:\Work\WPF_demo\WPF_DCStation_ZTE\WPF_DCStation_ZTE\res\Loading.gif");//此处路径必须是绝对路径this.gifImage.Width = 100;this.gifImage.Height = 100;label4.Content = this.gifImage;}
//开始private void button2_Click_1(object sender, RoutedEventArgs e){gifImage.StartAnimate();}//停止private void button3_Click(object sender, RoutedEventArgs e){gifImage.StopAnimate();}

效果展示

WPF 加载GIF图片相关推荐

  1. 关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片

    2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap  bm = BitmapFacto ...

  2. UIWebView如何加载本地图片

    UIWebView如何加载本地图片 UIWebView加载本地图片是有实用价值的.比方说,有时候我们需要本地加载静态页来显示相关帮助信息,而这些帮助信息当中含有很多很多的富文本,用代码实现难度较大,这 ...

  3. 解决Android 加载大图片OOM

    图片在Android 占用内存计算 假如一张图的像素为100×200,那么他在内存中占用的内存为: 100×200(像素点) × 4(每个像素点占用的内存,默认为4.) public Bitmap.C ...

  4. Android加载大图片OOM异常解决

    Android加载大图片OOM异常解决 参考文章: (1)Android加载大图片OOM异常解决 (2)https://www.cnblogs.com/jevan/archive/2012/07/05 ...

  5. python怎么加载图片-怎样用python加载dicom图片

    用python加载dicom图片的方法:使用pydicom.CV2.numpy.matplotlib等库即可.pydicom库是专门用来处理dicom图像的python专用库. python读取DIC ...

  6. 【Flutter】Image 组件 ( 加载网络图片 | 加载静态图片 | 加载本地图片 | path_provider 插件 )

    文章目录 一.加载网络图片 二.加载静态图片 三.加载本地图片 四.完整代码示例 五.相关资源 一.加载网络图片 参考 [Flutter]Image 组件 ( Image 组件简介 | Image 构 ...

  7. WPF 加载等待动画

    WPF 加载等待动画 原文:WPF 加载等待动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_29844879/article/detail ...

  8. thinkphp+ajax无刷新分页并加载显示图片

    2019独角兽企业重金招聘Python工程师标准>>> 最近自己用thinkphp和bootstrap做一个小站点,在用到ajax与后台数据库交互实现无刷新分页时,因为我需要返回的数 ...

  9. Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题

    今天在交流群里,有人问我他经常遇到加载图片时内存溢出的问题,遇到的情况还是在自己的测试机或者手机里没有问题,做好了, 到了客户手机里就内存溢出了.其实有时候不同的手机和不同的系统对内存的要求不一样,尤 ...

  10. 剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

最新文章

  1. Nodejs学习笔记之复制文件
  2. DNS隧道工具使用 不过其网络传输速度限制较大
  3. DL之YoloV2:Yolo V2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. WordPress解析之数据库
  5. pop to 特定的UIViewController
  6. Batch Normalization批量归一化
  7. 面向对象(final/抽象类/接口/内部类)
  8. vue 点击div 获取位置_vue接入腾讯位置服务之点击事件
  9. YTU 2837: 编程题B-狐狸算卦
  10. hdu - 1532 Drainage Ditches (最大流)
  11. Xamarin.Forms 解决ListView高度问题
  12. 伦敦皇家音乐学院公爵厅混响当前已添加到Altiverb 7软件
  13. 嵌入式系统开发-麦子学院(15)-根文件系统
  14. android wifi热点默认名称,Android 修改WiFi热点的默认SSID和密码
  15. 树莓派开发板入门学习笔记1:[转]资料收集及树莓派系统在Ubuntu安装
  16. ROS学习小笔记(Topic通信 ,service通信,参数服务器)
  17. css碎步测量,隧洞测量实习日记.doc
  18. 矿物岩石学知识点总结
  19. 用apktool反编译,修改添加smali文, 再打包apk遇到的64k问题的解决方法 Unsigned short value out of range: 65536
  20. 【MATLAB】MATLAB 仿真数字基带传输系统 — 双极性基带信号(余弦滚降成形脉冲)的眼图

热门文章

  1. LintCode 38: Search a 2D Matrix II
  2. SQL注入-DNSlog注入(手工加工具使用)
  3. 御用导航提示提醒页面_PowerBI 个性化定制你的报告导航
  4. 学习笔记:unity自带寻路(导航)系统:Nav Mesh导航网格
  5. linux下hg无法运行_linux下hg无法运行_Linux下Mercurial (hg)配置说明
  6. USB 协议整理 五:USB概述及协议基础(四)
  7. XShell切换全屏快捷键
  8. 自定义Xshell高亮
  9. Vue 之 .eslintrc.js 文件
  10. Android单元测试