增强型 PictureBox 控件,支持区域选择






3.74/5 (13投票s)
2004 年 3 月 3 日
3分钟阅读

89901

3086
增强型图片框控件,具有区域选择功能。
引言
从图像中选择和提取特定区域是图像处理应用程序(如照片编辑)的基本功能。这些功能是更高级图像处理功能(例如缩放或旋转图像)的起点。在本文中,介绍了一种 EnPicbox
控件,它允许用户从图像中选择一个矩形区域。EnPicbox
控件基于标准 PictureBox
控件,并封装了必要的消息处理机制,用于与用户选择进行交互。
背景
以下链接包含本文的背景信息
- 使用 Visual Basic .NET 或 Visual C# .NET 创建的 Windows 窗体控件
- With DrawImage,作者:Rod Stephens
- Basic Scripting Edition CInt 函数
使用代码
首先,在以下讨论中定义了两种用户:最终用户和程序员。最终用户是使用包含 EnPicbox
控件的最终应用程序的用户;而程序员使用 EnPicbox
控件开发应用程序。
EnPicbox
控件的源代码是不言自明的。
- 编程接口
EnPicbox
编程接口非常简单。程序员只需关注EnPicbox
控件的两个属性:SourceImage
和SelectArea
。SourceImage
属性提供了一个接口,用于设置或获取EnPicbox
控件中当前显示的图像。实际上,它与标准PictureBox
控件中的 image 属性完全相同,因此它可以采用 VB.NET 中Bitmap
类支持的任何图像格式。SelectArea
是一个Readonly
属性,它根据用户选择输出一个Bitmap
对象。以下代码段显示了EnPicbox
控件的基本操作。EnPixbox1.SourceImage = "1.bmp" 'input image from a file Picturebox1.Image = EnPixbox1.SelectArea 'Output Selected Area to a Picturebox control
EnPicbox
始终尝试在其显示区域中显示整个图像,因此会根据EnPicBox
中显示区域的大小调整源图像的大小。因此,源图像的外观可能会失真。更重要的是,用户选择不是在控件的显示区域上进行操作,而是在SourceImage
上进行操作。 EnPicbox
的最终用户界面最终用户通过按下鼠标左键开始选择,通过按住并移动鼠标来调整选择,并通过释放鼠标左键来完成一次选择。最终用户可以通过双击鼠标左键来确认选择。请程序员注意,只有在完成确认后才能从
SelectArea
属性中检索当前选择。按下鼠标右键会激活一个上下文菜单,最终用户可以使用该菜单选择标记的宽度和颜色,并且可以使用此菜单清除标记或进行确认。
不可靠的 VB 整数数据类型计算和转换
可能会注意到,在 EnPicBox
控件中,height 和 width 属性被设置为 double
数据类型。原因是 VB 整数数据计算和转换的不一致。读者可以尝试以下代码
Dim i, j as Integer
i = 5/2
j = 3/2
结果是 i = 2,j = 2。这是有趣的 VB CInt
函数的结果。VB 中有两个整数数据转换函数:CInt
和 Int
。Int
函数始终将十进制数据类型向下舍入,即 Int(2.5)
=Int(2.9)
=2。但是,MS 选择 CInt
将整数计算结果转换为整数。CInt
函数的特征或错误(毫无疑问,MS 将其视为特征并在其文档中对其进行了正式化)是,当任何十进制数据类型的十进制部分中存在 0.5 时,它会四舍五入到最接近的偶数。不幸的是,数组索引计算在图像处理应用程序中是不可避免的;并且索引必须是整数数据类型。因此,我强烈建议程序员在 VB 中对任何计算都使用十进制数据类型(我已经在 VB6、VB.NET 2002 和 VB.NET 2003 上测试过这些)。EnPicBox
中的私有函数 d2i
解决了这个问题,它将大于或等于 .5 的任何小数部分四舍五入为上限,并将小于 .5 的小数部分四舍五入为下限。
欢迎提出意见
我刚接触 .NET 基础设施。非常欢迎您的任何意见或建议。