在实际应用开发中,图像是程序不可获取的一部分,合理的利用图像不仅可以点缀美化软件,还可以起到事半功倍的效果,今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中图像控件的相关应用,仅供学习分享使用,如有不足之处,还请指正。
概述
在WinForms开发框架中,与图像相关的控件主要有两个:
- PictureBox,控件用于以位图、GIF、JPEG、元文件或图标格式显示图形。
- ImageList,组件用于存储图像,然后可由控件显示。 图像列表允许为单个一致的图像目录编写代码。
PictureBox
PictureBox 控件用于以位图、GIF、JPEG、元文件或图标格式显示图形,PictureBox控件的关键属性如下:
- Image,通过在运行时或设计时设置此属性,可以让控件显示图片。
- ImageLocation 属性来指定图像的位置。
- SizeMode,图像的大小和位置的处理模式,它共有四个值,默认为Normal:
- Normal 表示图像放置在控件的左上角;如果图像大于控件,则其下边缘和右边缘被剪裁。
- CenterImage 表示图像在控件中居中,如果图像大于控件,则图像的外部边缘会被裁剪。
- StretchImage 表示将图像的大小调整为控件的大小。
首先拖动控件PictureBox到Form表单中,并命名为pbImage,在Visual Studio设计器中,PictureBox控件为虚线边框的正方形控件,可以在设计时通过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"); this.pbImage.ImageLocation = imageFile; this.pbImage.Load();}
运行示例,效果如下所示:
订阅FormClosed事件,并在事件中释放图像资源,主要释放图像使用的内存,然后清除图形。 如果内存管理出现问题,垃圾回收稍后将释放内存。代码如下所示:
private void FrmImage_FormClosed(object sender, FormClosedEventArgs e){ if (pbImage.Image != null) { pbImage.Image.Dispose(); pbImage.Image = null; }}
当Form表单关闭时,会触发FormClosed事件,执行图像的释放。
ImageList
ImageList 组件用于存储图像,然后可由控件显示,图像列表允许为单个一致的图像目录编写代码。组件的关键属性主要有以下几个:
- Images,表示包含关联控件要使用的图片。 每个图像都可以通过其索引值或键访问。
- 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];}
上述示例提前判断当前图片的索引是否是第一张,和最后一张,主要是为了防止数组越界。
运行示例,效果图像所示:
由于Images本身是图像列表类型,可以通过Images的Clear方法,Remove方法删除图片。如下所示:
imgList.Images.Remove(myImage);imgList.Images.Clear();
System.Drawing.Image myImage = Image.FromFile(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)+ @"\Image.gif");imgList.Images.Add("myPhoto", myImage);imgList.Images.RemoveByKey("myPhoto");
源码获取
关于本系列的完整代码,可以通过gitee上的库进行获取:https://gitee.com/ahsiang/winforms
阅读原文:https://mp.weixin.qq.com/s/AFABsEcCC-6xcD-9eN3wMQ
该文章在 2026/7/7 10:55:59 编辑过