使用 System.Drawing 制作选择工具,并在 vb.net 中裁剪图像

Posted

技术标签:

【中文标题】使用 System.Drawing 制作选择工具,并在 vb.net 中裁剪图像【英文标题】:Using System.Drawing to make a selection tool, and cropping an image in vb.net 【发布时间】:2009-09-04 21:00:50 【问题描述】:

如果我想在 VB.net 中裁剪图像,我该怎么做?我试图让用户拖出他们想要的框(system.drawing.rectangle),它会自动移除框周围的边缘。

我的第一个问题主要是我无法使 system.drawing.rectangle 可见。它根本没有显示,我正在以编程方式设置它的位置和高度,但没有显示任何内容。我知道我可能遗漏了一些相当明显的东西......但我似乎找不到它。

然而,我更大的问题在于裁剪本身。我根本找不到任何裁剪方法。有没有我想念的隐藏的?还是我必须自己编码?我该怎么做呢?它应该能够输出到位图图像对象。

感谢您的帮助,我很惊讶以前没有人问过这个问题......

【问题讨论】:

【参考方案1】:

关于您的第一个问题:矩形本身不可见。您必须使用 Graphics 对象的 DrawRectangle(...) 方法在画布上绘制它。要绘制选择工具,您需要设置 Pen 对象的 DashCap 和 DashPattern 属性。

要“裁剪”图像,您基本上是希望将较大图像的一部分用较小的矩形划定,然后将其转换为新的位图。这可以使用 Graphics 对象的 DrawImage(...) 方法的 30 个重载之一来完成。您可以将裁剪部分保持在其原始尺寸(导致比原始尺寸更小的位图),或者您可以将其“放大”到类似于原始图像的大小。如果您采用后一种方法,通常最好将 Graphics 对象的 InterpolationMode 属性设置为 HighQualityBicubic(我认为就是这样),因为默认的 InterpolationMode 非常糟糕。

在 .Net 中有许多不同的渲染图像的方法 - 如果您发布一些代码以及您遇到的确切问题的解释,这可能会有所帮助。

Here is another answer 带有指向示例应用程序的链接(以及 C# 中的源代码,抱歉),这可能会帮助您入门。

【讨论】:

好的,我解决了裁剪问题,现在如何使矩形绘图在多个方向上工作?它只绘制到鼠标的右下角,这对我来说毫无意义。我还必须计算窗口偏移量和鼠标偏移量 (4,30),现在我坚持让下一部分工作。 @Cyclone:您可能想发布一些代码,因为我真的不知道您正在绘制什么样的表面,或者您如何显示您的位图。我猜您正在存储 MouseDown 事件(e.Location)中的点,然后在每个 MouseMove 事件中,您使用 MouseDown 事件中的 e.Location 和 e.Location 之间的差异创建一个新的 Rectangle。来自 MouseMove 和原始的位置,然后绘制那个 Rectangle。 @Cyclone: 不能给 Rectangle 中的 Width 和 Height 指定负值(其实可以,但是什么都不会画),所以需要写一点逻辑代码来处理向上和向左移动(在这种情况下,您将改为使用 MouseMove 事件中的 e.Location 作为 Rectangle 的位置,然后通过从 e 中减去 e.Location[MouseDown] x 和 y 值来计算宽度.Location[鼠标移动]. Rectangle(Point location, Size size)的构造函数中的Point参数总是指Rectangle的左上角。 对,有道理,稍后会在这部分工作。我使用克隆进行了裁剪,这很好。不过,请参阅我的最新问题,在用户裁剪图像 8 次左右后,内存不足异常未得到处理。【参考方案2】:

CodeProject 上有很多关于这些主题的文章:

选择您最喜欢的风格(尽管我鼓励您查看 C# 项目 - 转换应该不会太难)。

VBImage Cropping with Image Resizing Using vb.net

C#Cropping Images An Easy to Use Image Resizing and Cropping ControlImage Processing using C#(请参阅裁剪部分 - 我能够在我的一个项目中使用此代码)

WPF/C#WPF Interactive Image Cropping ControlA Photoshop-like Cropping Adorner for WPF

【讨论】:

您遇到错误了吗?它是如何“失败”的?我已经链接了一些代码示例,它们可以完成您需要做的事情 - 您是否尝试研究这些作者如何完成您需要做的事情并将他们的技术应用于您自己的代码? 它没有从/到正确的位置进行裁剪,事实上,它看起来通常是随机裁剪的。

以上是关于使用 System.Drawing 制作选择工具,并在 vb.net 中裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像 url 转换为 system.drawing.image

对“位图”类型的引用声称它在“System.Drawing”中定义,但找不到

在控制台应用程序下找不到 System.drawing 命名空间

使用 System.Drawing.Font.FromHfont(IntPtr hfont) 从 SYSTEM_FONT Stock 对象创建 System.Drawing.Font

System.Drawing.SolidBrush 使用啥混合方程?

Mono 是不是支持 System.Drawing 和 System.Drawing.Printing? [关闭]