CSharp Tips:在Form中显示动画图片

C# WinForm窗口中加载GIF图片,实现图片动态显示 我们在开发窗口程序中,多数会用PictureBox控件来显示图片,用属性BackgroundImage加载图片做为背景,用BackgroundImageLayout属性对图片进行平铺、拉伸等操作。但是对于背景是GIF动态图片,它显示出来的还是静态的,用Image属性设置,效果一样,还是静态,那该如何设置呢?在Form的构造函数中把GIF文件赋值给PictureBox的Image,并打开双缓冲,并且让PictureBox控件将自行绘制背景,而不是通过操作系统来绘制。 阅读详情
在Windows Form的程序中有的时候需要显示动画,例如连接网络的动态图标。传统的做法可能是做一组BMP表示不同的状态,然后在Form上添加一个定时器,隔若干毫秒,绘制下一幅图片,如此循环。但是只能是BMP,没法自动支持本身有动画效果的Gif格式的图片。
在DotNET中有一个ImageAnimator类,动画处理包含基于时间的帧的图像,这样的在C#中就不需要加载一组图片了,一个Gif轻松搞定,程序也干净很多。
 
ImageAnimator类
这个类非常简单,主要有几个方法
1)Animator,启动一个多帧的图片,开始动画显示。这里需要制定一个回调函数onFrameChangedHandler,当图片内部间隔时间达到时触发,通常在这个回调函数中刷新界面,显示下一帧图片。特别强调一点,可能ImageAnimator内部用线呈池的定时器检查时间间隔,所以该回调函数触发时,不在程序的主线程中,要注意同步的问题。
2)CanAnimator方法,判断图片是否是动画图片。
3)StopAnimator方法,比较简单,就是停止正在运行的动画。
4)UpdateFrame方法,使该帧在当前正被动画处理的所有图像中前移。新帧在下一次呈现图像时绘制。如(1)所述onFrameChangedHandler不是在主线程中被触发,所以利用这个事件调用UpdateFrame时一定要考虑同步,如果在绘制图片的同时调用UpdateFrame,或者在调用UpdateFrame时绘制图片都会产生资源冲突的异常。所以建议UpdateFrame和绘制图片的动作都在主线程中去执行。
 
一个完整的示例
显示动画图片的思路是,加载图片,然后调用ImageAnimator.Animator方法,同时指定onFrameChangedHandler毁掉函数;onFrameChangedHandler被触发时重绘界面;在窗口绘制时,调用UpdateFrame,然后绘制图片。
代码如下:
using  System;
using  System.Drawing;
using  System.Collections;
using  System.ComponentModel;
using  System.Windows.Forms;
using  System.Data;
using  System.Diagnostics;
 
namespace  Graphics
{
 
/// <summary>
 
/// Summary description for Form1.
 
/// </summary>

 public class Form1 : System.Windows.Forms.Form
 
{
  
/// <summary>
  
/// Required designer variable.
  
/// </summary>

  private System.ComponentModel.Container components = null;
 
  
private Image   m_imgImage = null;
  
private EventHandler m_evthdlAnimator = null;
 
  
public Form1()
  
{
   
//
   
// Required for Windows Form Designer support
   
//
   InitializeComponent();
   
this.SetStyle(ControlStyles.UserPaint,true);
   
this.SetStyle(ControlStyles.DoubleBuffer,true);
   
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
 
   
//
   
// TODO: Add any constructor code after InitializeComponent call
   
//
   m_evthdlAnimator = new EventHandler(OnImageAnimate);
   Debug.Assert(m_evthdlAnimator 
!= null);
  }

 
  
/// <summary>
  
/// Clean up any resources being used.
  
/// </summary>

  protected override void Dispose( bool disposing )
  
{
   
if( disposing )
   
{
    
if (components != null) 
    
{
     components.Dispose();
    }

   }

   
base.Dispose( disposing );
  }

 
  
protected override void OnPaint(PaintEventArgs e)
  
{
   
base.OnPaint (e);
 
   
if (m_imgImage != null)
   
{
    UpdateImage();
    
// 绘制图片的当前帧
    e.Graphics.DrawImage(m_imgImage,new Rectangle(10,10,m_imgImage.Width,m_imgImage.Height));
   }

  }

 
  
protected override void OnLoad(EventArgs e)
  
{
   
base.OnLoad (e);
 
   m_imgImage 
= Image.FromFile("10.gif"); // 加载测试用的Gif图片
   BeginAnimate();
  }

 
 
 
  
Windows Form Designer generated code
 
  
/// <summary>
  
/// The main entry point for the application.
  
/// </summary>

  [STAThread]
  
static void Main() 
  
{
   Application.Run(
new Form1());
  }

 
  
private void Form1_Closed(object sender, System.EventArgs e)
  
{
   
if (m_imgImage != null)
   
{
    StopAnimate();
    m_imgImage 
= null;
   }

  }

 
  
functions of animator image // End of functions of animator image
 
 }

}

最后还有一点注意事项
动画图片的绘制可能会比较频繁,由此造成闪烁,解决办法有两个:
1)不要调用 this.Invalid()重绘整个窗口,而应该调用 this.Invalid(rect)仅绘制显示图形的区域。
2)指定一下窗口风格,启动窗口的双缓存。
   this.SetStyle(ControlStyles.UserPaint,true);
   this.SetStyle(ControlStyles.DoubleBuffer,true);
   this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
 
 
参考文档
C# winform帧动画 字符动画个人觉得更具挑战性,可惜没那么多时间和精力来独自研究。本文示例 利用系统线程实现将图片轮播配上音乐还原视屏原效果。功能包括暂停播放,继续播放. 另外本示例以 Bad Apple为例。将视屏每帧转成图片,网上工具很多,可以网上搜索一下。using System; using System.Collections.Generic; using System.ComponentModel; us... 阅读详情

相关推荐

C#动画控件(一张图包含所有动作)

如游戏中,一张图片中包含了动画的所有帧。其实没必要做这么个控件,只需要将动画做成Gif,然后使用PictureBox加载这个Gif就可以了~囧。但是为了验证是否两者有区别,特意做了这个动画控件,直接丢弃了太可惜,记录一下吧~~以后需要可以直接用。 步骤: 1. 添加组件AnimationControl,添加一个Sytem.Windows.Timer作为帧管理器。 2. 注册Timer的Tic

Yokeqi的专栏 6512

.NET编程——利用C#显示图片(WinForm)

利用C#显示图片

吾门的博客 1万+

从0到1的C#控制台显示图像

引言:10多年前用C#写过一些简单的应用,现在想用C#写个简单的界面,已经不记得从哪里将工具栏调出来,如何注释掉代码。作为从头开始,就再记录一下。作为C#应用的入门程序,在C#控制台程序中,需要先安装OpenCV相关依赖和运行环境,创建控制台程序,再读取图片,显示图片。

Robot3366的博客 1039

.C#窗体上怎么显示动态图片如gif

 方法一(简单):用label,然后设置为背景图片 方法二:使用GDI+ 来实现 (很粗略的实现,没有帧间隔)             Image image = Image.FromFile("e:\\temp.gif");                         FrameDimension fd = new FrameDimension(image.FrameDime

夏日向日葵的专栏 7329

用C#读取并显示图像文件

请注意,在实际使用中需要根据情况修改文件路径和保存文件名等参数,以便正确读取并处理图像文件。本文将介绍如何使用C#编写程序,读取并显示图像文件。两个命名空间,以便能够使用与图像操作和窗体操作相关的类和方法。类从位图中创建画布,以便进行进一步的图像处理。方法读取指定路径的图像文件,并将其赋值给。方法将处理后的图像保存为新的文件。方法将图像绘制到画布上,并使用。用C#读取并显示图像文件。方法输出提示信息,并使用。首先,需要在程序中引用。转换为位图格式,并使用。方法防止程序立即退出。

ByteLegend的博客 1460

C#实现浏览显示图象(附完整源码)

C#实现浏览显示图象(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 467

C# ImageAnimator 绘制GIF偶尔红叉

绘图是偶尔出现无法绘制的原因是,更新帧的时候,绘图界面调用绘制(此时GIF图片被占用,所以红叉)。 private void UpdatedFrameChanged(object s, EventArgs e) { _isUpdateFrame = true; ImageAnimator.UpdateFrames(_gi

assky124的专栏 2174

C#: 图像文件读取与显示实现

现在,当我们运行应用程序并点击"打开图像文件"按钮时,将会弹出一个文件对话框,让我们选择要显示的图像文件。这样,我们就成功实现了在C#中读取图像文件并显示的功能。在C#中,我们可以使用.NET框架提供的类库来读取和显示图像文件。接下来,我们可以编写一个简单的窗体应用程序来实现图像文件的读取和显示。在构造函数中,我们初始化窗体的组件,包括一个按钮和一个PictureBox控件。方法读取图像文件,并将其赋值给PictureBox的Image属性,以便在窗体上显示图像。在上面的代码中,我们创建了一个。

qq_37934722的博客 1084

C# WINFORM 控件动画无闪烁的例子DEMO(C#无闪烁画图二)

因为上一个专题"程序服务器和客服端对象更新"的需要, 要在C# WINFORM 中有物体的移动,需要不闪烁的动画 这里单独把这个无闪烁动画的功能说明一下: 程序在WINFORM的控件上画出每一帧的图像来实现动画, 程序先自己创建一张BMP图片对象,有什么动画就在这张BMP对象上画出来。 最后再把这张BMP显示在控件上,这样可以避免直接在控件上作画的图像闪烁。 代码中没有用什么特别...

刘欣的优快云博客 2127

C#如何使用图像控件显示图片

C#如何使用图像控件显示图片

ArcGIS中的Python入门知识点整理

关于Arcpy大家应该都比较熟悉,Python用的好,数据处理快又好!在ArcGIS中ArcPy是一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能进而构建而成的站点包。目的是为以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础。ArcPy提供了丰富纯正的Python体验,具有代码自动完成功能。今天我们就看看关于Arcpy相关处理的使用,通过一些简单代码与大家一起认识Arcpy。

xjt921122的博客 1771

C#图像显示

文章目录一、PictureBox采用直接赋值Image的方式进行显示图像二、PictureBox采用GDI绘图三、两种方式的效果及速度对比四、相关的测试程序及图像 一、PictureBox采用直接赋值Image的方式进行显示图像 private void DisplayImage(PictureBox pb, Bitmap bitmap) { //判断 bitmap非空,并且未被 Dispose() 后进行赋值显示 if (bitmap != null && bitm.

weixin_40112412的博客 3697

【mysql8.0.33安装详情教程】

8、进入Account and Roles界面,输入密码,再点击next(密码随便输,自己记住就行)11、进入Apply Configuration界面,直接点Execute,等待应用成功。14、输入密码,点击check,检查是否正确。3、下图是选择安装类型,选择默认安装就可以,然后点击“next”。5、进入Product Configuration,点击next。9、进入Windows Service界面,直接点击next。15、点击Execute执行安装(完成后点击Finish)二、验证是否安装成功。

98渣渣辉的博客 2114

自学C# 7.C#中利用pictureBox控件直接显示

C#中利用pictureBox控件直接显示

orange_dpp的博客 2719

ROS应用之如何配置RTOS满足机器人系统中的实时要求

实时操作系统(RTOS)基本概念实时操作系统(RTOS)是设计用于实时应用的操作系统,其主要目标是在确定的时间内完成任务。RTOS的任务调度算法和优先级控制机制能够确保高优先级任务按时完成。精确的传感器数据采集:传感器数据需要在规定时间内采集并传输给控制系统。快速响应外部事件:对于控制系统,需要确保指令在最短的时间内得到响应。任务的调度周期:任务的周期可以通过公式计算,其中 ftask 是任务的调度频率。优先级分配。

weixin_68094467的博客 1008

15. GD32E230定时器实战:基于TIMER5的1秒LED闪烁中断配置详解

本文详细讲解了如何在GD32E230微控制器上配置TIMER5定时器,实现精准的1秒LED闪烁中断。内容涵盖从时钟开启、参数计算、中断设置到服务函数编写的完整流程,重点解析了预分频值与周期值的配置方法,帮助开发者掌握硬件定时器的核心应用。

weixin_29092787的博客 135

C#利用Picturebox控件显示图片

C#利用Picturebox控件显示图片 1、Picturebox控件SizeMode属性 (1)Normal模式:如果图片大于Picturebox控件大小,图片不能完全显示 (2)AutoSize:自动调整Picturebox控件大小去适应图片的大小,图片可以完全显示。 (3)StretchImage:Picturebox控件大小不变,自动调整图像适应控件。 2、使

liyuqian199695的博客 13万+

Open3D KD-tree的使用【2025最新版】

Open3d使用FLANN构建KDTree以便进行快速最近邻检索。博客长期更新,本文最近一次更新时间为:2025年1月1日,代码已同步更新至Open3D 0.18.0版本。

点云侠的博客 40万+

C#(winform)窗体展示图片

概述点击dgv的任意列展现出当前点击列的图片。form2窗体图片使用prc控件。

sdfahd的博客 4976

SAP CAP 编程模型简介

官网 CAP 是用于构建企业级服务和应用程序的语言、库和工具框架。它引导开发人员沿着经过验证的最佳实践和大量现成的解决方案来应对重复性任务的“黄金之路”。 基于 CAP 的项目受益于对领域的主要关注。我们没有深入研究过于技术性的学科,而是专注于在快速变化的云技术世界中加速开发和保护投资。 CAP 框架融合了经过验证和广泛采用的开源和 SAP 技术,如下图所示。 在开源技术之上,CAP主要增加了: 核心数据服务 (CDS) 作为我们用于域模型和服务定义的通用建模语言。 用于 Node.js 和 Ja

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1550

解锁RK3588+RTL8211F:千兆以太网PHY调优秘籍

本文探讨了RK3588芯片搭配RTL8211F千兆以太网PHY的优化方案。文章首先分析了RK3588和RTL8211F的硬件特性,指出时序问题可能源于时钟信号不稳定、传输延迟和PHY内部逻辑延迟。针对这些问题,提出了选用高质量时钟源、优化PCB布线等时序优化策略,以及合理配置硬件参数、优化网络协议等延迟优化方法。在配置实践部分,详细介绍了硬件连接规范和软件配置步骤,并建议使用Iperf、Ping等工具进行性能测试。最后总结了常见问题解决方案,展望了未来PHY芯片和传输技术的发展趋势。这些优化措施可显著提升网

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 288

c#应用:简单的图片查看器

在winform中,利用目录选择对话框,pictureBox,listBox,textBox,以及一个Button可以实现一个简单图片查看器的功能,在这里做一下简单的介绍。首先我们进行简单的布局并给控件设置合适的name。 首先我们在文本框里加载出图片文件夹的路径 private void browseBtn_Click(object sender, EventArgs e) { FolderBrowserDialog dlg = new FolderBrowser

qq_48238667的博客 3024

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:多旋翼无人机在风扰动下的稳定性分析

本文介绍了使用Simulink仿真多旋翼无人机在风扰动下稳定性的方法。通过构建包含飞行器动力学模型、PID控制系统和环境模拟模块的仿真系统,分析了无人机在不同风速条件下的飞行性能。详细说明了从创建模型、设置动力学方程、设计PID控制器到添加风扰动模型的完整流程,并提供了性能评估指标。该方法可用于验证控制系统有效性,优化飞行稳定性参数,为无人机控制系统的设计和调试提供参考。

MHD0815的博客 328

图片加载动画效果

图片选中的两种方法 开发工具与关键技术:DW CSS3旋转动画 作者:周欢 撰写时间:2019/3/3 纯图片排版美观还是动态的图片排版美观?要是是我我会选择动态的图片排版,显得有活力。 其实在还没有接触CSS3动画之前我感觉CSS3动画很难,但是它有很有趣。在接触CSS3动画之后就觉得它好像也没那么难,而且是越发越有趣。使用CSS3动画可以做出有意思的动画效果图,看一个小页面动起来的感觉很不...

weixin_44543219的博客 3422

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

编码系列--Base32编码

0、写在前面这里讨论的编码主要的目的是将不可显示的二进制数组转变为可显示的字符串,包括其逆运算。通过特定的协议传输数据,或者加密解密的时候都会用到类似的方法。在这类运算中用的比较多的是Base64,比如MIME中,DotNET中更是直接提供了Base64 Encode和Decode的方法,相当方便。但是Base64通常由“a-z”、“A-Z”、0-9以及“+”和“=”这些符号组成,当中包含

疾风之狼 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: DotNET的混淆器--Dotfuscator的使用说明
下一篇: DotNET 1.1迁移至DotNET 2.0的注意事项
Mittermeyer
博客等级 码龄25年 60粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值