基于.NET的Windows窗体编程之WinForms图像控件

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.Images0;

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.ImagesimageIndex;

}

private void btnNext_Click(object sender, EventArgs e)

{

if (imageIndex >= this.imgList.Images.Count - 1)

{

return;

}

imageIndex++;

this.pbImage.Image = this.imgList.ImagesimageIndex;

}

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

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

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");

相关推荐
笨鸟先飞,勤能补拙9 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
界面开发小八哥10 小时前
界面控件DevExpress Blazor v26.1新版亮点 - 辅助功能增强
.net·界面控件·blazor·devexpress·ui开发
我上去就是一套QWER然后等待复活10 小时前
Windows 清理 CC Switch 并恢复官方 Codex CLI 登录流程(完整记录)
windows
吾儿良辰11 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
哎呦喂我去去去11 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#
比卡超哥13 小时前
记一次 .NET 某光谱检测软件 内存暴涨分析
.net
脚踏实地皮皮晨15 小时前
002002002_DepandencyObject类2
开发语言·windows·算法·c#·visual studio
驱动小百科15 小时前
Windows运行库合集下载 VC++、DirectX、.NET运行库安装教程
c++·windows·.net·windows运行库合集下载·windows运行库安装
05664616 小时前
Python康复训练——数据结构
数据结构·windows·python
你有哈莫吗16 小时前
记一次 .NET 某自动化智能制造软件 卡死分析
自动化·.net·制造