惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
G
Google Developers Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Engineering at Meta
Engineering at Meta
B
Blog
博客园_首页
量子位
博客园 - 叶小钗
L
LangChain Blog
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
F
Fortinet All Blogs
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
D
DataBreaches.Net
雷峰网
雷峰网
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
I
Intezer
H
Help Net Security
The Hacker News
The Hacker News
The Register - Security
The Register - Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
AWS News Blog
AWS News Blog
V
V2EX
Microsoft Security Blog
Microsoft Security Blog
T
Tenable Blog
Spread Privacy
Spread Privacy
A
Arctic Wolf
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
Schneier on Security
Schneier on Security
C
CERT Recently Published Vulnerability Notes
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Last Watchdog
The Last Watchdog
Latest news
Latest news
T
Troy Hunt's Blog
L
LINUX DO - 热门话题

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms提示控件 基于.NET的Windows窗体编程之WinForms时间控件 基于.NET的Windows窗体编程之WinForms图表控件 基于.NET的Windows窗体编程之WinForms输入与显示 基于.NET的Windows窗体编程之WinForms菜单工具栏 基于.NET的Windows窗体编程之WinForms打印 基于.NET的Windows窗体编程之WinForms对话框 基于.NET的Windows窗体编程之WinForms列表控件 基于.NET的Windows窗体编程之WinForms数据表格 基于.NET的Windows窗体编程之WinForms事件简介 基于.NET的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 推荐一款基于.NET和百度飞桨的OCR识别组件 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一种异步线程执行过程中更新进度的方法 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器 推荐一种程序崩溃闪退或卡死的分析方法 推荐一款Excel读写神器之MiniExcel入门详解 推荐一款Ioc容器之Ninject入门详解 ASP.NET Core WebApi+React UI开发入门详解
基于.NET的Windows窗体编程之WinForms图像控件
老码识途呀 · 2026-07-06 · via 博客园 - 老码识途呀

在实际应用开发中,图像是程序不可获取的一部分,合理的利用图像不仅可以点缀美化软件,还可以起到事半功倍的效果,今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中图像控件的相关应用,仅供学习分享使用,如有不足之处,还请指正。

image

概述

在WinForms开发框架中,与图像相关的控件主要有两个:

  • PictureBox,控件用于以位图、GIF、JPEG、元文件或图标格式显示图形。
  • ImageList,组件用于存储图像,然后可由控件显示。 图像列表允许为单个一致的图像目录编写代码。

PictureBox

PictureBox 控件用于以位图、GIF、JPEG、元文件或图标格式显示图形,PictureBox控件的关键属性如下:

  • Image,通过在运行时或设计时设置此属性,可以让控件显示图片。
  • ImageLocation 属性来指定图像的位置。
  • Load 方法同步加载图像。
  • LoadAsync 方法异步加载图像。 
  • SizeMode,图像的大小和位置的处理模式,它共有四个值,默认为Normal:
    • Normal 表示图像放置在控件的左上角;如果图像大于控件,则其下边缘和右边缘被剪裁。 
    • CenterImage 表示图像在控件中居中,如果图像大于控件,则图像的外部边缘会被裁剪。 
    • AutoSize 控件的大小调整为图像的大小。 
    • StretchImage 表示将图像的大小调整为控件的大小。

首先拖动控件PictureBox到Form表单中,并命名为pbImage,在Visual Studio设计器中,PictureBox控件为虚线边框的正方形控件,可以在设计时通过Image属性设置控件显示的图片,所见即所得,如下所示:

image

运行示例,效果如下所示:

image

在上述示例中,PictureBox控件的SiteMode为Normal,图像大小小于PictureBox控件的大小,没有填满控件,剩余部分显示控件的背景色(Yellow)。

PictureBox控件不仅可以在设计器中添加图片,还可以通过C#代码加载控件,在Form的Load事件中,为PictureBox控件赋值,如下所示:

private void FrmImage_Load(object sender, EventArgs e)
{
    string imageFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Constellation", "02.jpg");
    //方法一,为Image属性赋值Image对象实例
    //this.pbImage.Image = Image.FromFile(imageFile);
    //方法二,为ImageLocation属性赋值图片路径,并调用Load方法
    this.pbImage.ImageLocation = imageFile;
    this.pbImage.Load();
}

运行示例,效果如下所示:

image

订阅FormClosed事件,并在事件中释放图像资源,主要释放图像使用的内存,然后清除图形。 如果内存管理出现问题,垃圾回收稍后将释放内存。代码如下所示:

private void FrmImage_FormClosed(object sender, FormClosedEventArgs e)
{
    if (pbImage.Image != null)
    {
        pbImage.Image.Dispose();
        pbImage.Image = null;
    }
}

当Form表单关闭时,会触发FormClosed事件,执行图像的释放。

ImageList

ImageList 组件用于存储图像,然后可由控件显示,图像列表允许为单个一致的图像目录编写代码。组件的关键属性主要有以下几个:

  • Images,表示包含关联控件要使用的图片。 每个图像都可以通过其索引值或键访问。 
  • ColorDepth 属性确定图像呈现的颜色数。
  • ImageSize 属性设置图像将以相同的大小显示,更大的图像将被缩放以适应。

首先拖动ImageList控件到Form表单中,并命名为imgList,ImageList控件并不会直接显示在页面中,而是显示在组件托盘中,一般与其他控件一起使用,如ListView。

首先在Form的Load事件中为ImageList控件添加图像,并将PictureBox控件的图像设置为ImageList的第一张图像。如下所示:

private void FrmImage_Load(object sender, EventArgs e)
{
    var images = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Constellation"));
    images = images.OrderBy(item => item).ToArray();//排序
    foreach (var image in images)
    {
        this.imgList.Images.Add(Image.FromFile(image));
    }
    this.imgList.ImageSize = new Size(200, 200);
    this.pbImage.Image = this.imgList.Images[0];
    this.pbImage.SizeMode = PictureBoxSizeMode.CenterImage;
    this.imageIndex = 0;
}

然后添加两个按钮,分别用于切换前一张,下一张图片,如下所示:

private int imageIndex = 0;

private void btnPrev_Click(object sender, EventArgs e)
{
    if (imageIndex <= 0)
    {
        return;
    }
    imageIndex--;
    this.pbImage.Image = this.imgList.Images[imageIndex];
}

private void btnNext_Click(object sender, EventArgs e)
{
    if (imageIndex >= this.imgList.Images.Count - 1)
    {
        return;
    }
    imageIndex++;
    this.pbImage.Image = this.imgList.Images[imageIndex];
}

上述示例提前判断当前图片的索引是否是第一张,和最后一张,主要是为了防止数组越界。

运行示例,效果图像所示:

image

由于Images本身是图像列表类型,可以通过Images的Clear方法,Remove方法删除图片。如下所示:

// 删除指定图片.
imgList.Images.Remove(myImage);
//清空所有图片.
imgList.Images.Clear();

还可以通过Key进行添加和删除图片,如下所示:

//按Key添加图片
System.Drawing.Image myImage = Image.FromFile(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)+ @"\Image.gif");
imgList.Images.Add("myPhoto", myImage);
//按key删除图片.
imgList.Images.RemoveByKey("myPhoto");

源码获取

关于本系列的完整代码,可以通过gitee上的库进行获取:https://gitee.com/ahsiang/winforms

image

以上就是《基于.NET的Windows窗体编程之WinForms图像控件》的全部内容,旨在抛砖引玉,一起学习,共同进步!!!