65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.74/5 (13投票s)

2004 年 3 月 3 日

3分钟阅读

viewsIcon

89901

downloadIcon

3086

增强型图片框控件,具有区域选择功能。

Sample Image

引言

从图像中选择和提取特定区域是图像处理应用程序(如照片编辑)的基本功能。这些功能是更高级图像处理功能(例如缩放或旋转图像)的起点。在本文中,介绍了一种 EnPicbox 控件,它允许用户从图像中选择一个矩形区域。EnPicbox 控件基于标准 PictureBox 控件,并封装了必要的消息处理机制,用于与用户选择进行交互。

背景

以下链接包含本文的背景信息

  1. 使用 Visual Basic .NET 或 Visual C# .NET 创建的 Windows 窗体控件
  2. With DrawImage,作者:Rod Stephens
  3. Basic Scripting Edition CInt 函数

使用代码

首先,在以下讨论中定义了两种用户:最终用户和程序员。最终用户是使用包含 EnPicbox 控件的最终应用程序的用户;而程序员使用 EnPicbox 控件开发应用程序。

EnPicbox 控件的源代码是不言自明的。

  1. 编程接口

    EnPicbox 编程接口非常简单。程序员只需关注 EnPicbox 控件的两个属性:SourceImageSelectAreaSourceImage 属性提供了一个接口,用于设置或获取 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 上进行操作。

  2. 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 中有两个整数数据转换函数:CIntIntInt 函数始终将十进制数据类型向下舍入,即 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 基础设施。非常欢迎您的任何意见或建议。

© . All rights reserved.