鼠标单击图片框时图像的着色区域

Posted

技术标签:

【中文标题】鼠标单击图片框时图像的着色区域【英文标题】:Coloring area of an image on mouse click over picturebox 【发布时间】:2014-08-07 10:09:14 【问题描述】:

我希望能够用给定颜色填充图像的任何给定区域,就像您可以使用绘画来填充矩形、圆形或任何其他由颜色分隔的形状一样。

为了简单起见,我已经将图片框源图像设置为与图片框本身相同的大小,这应该会更容易一些。

如果我有一个带有图像和已定义颜色的图片框,并且用户只需单击图片框即可使用这种颜色填充任何区域,我该怎么做。

void pictureBox1_MouseClick(object sender, MouseEventArgs e)

   // The color to be used
   Color color = Color.Red;
   // Image has same dimensions as picturebox to make things easier
   Image img = pictureBox1.Image; 
   // Where it was clicked.
   Point clickCoords = new Point(e.X, e.Y);
   // Coloring that area clicked much like Paint does. How?
   ...
   // After coloring show the result in the picture box again
   pictureBox1.Image = img;

谢谢。

编辑:我想要的行为示例。

为了明确我的目标,让我添加这个小例子。

你知道 MS Paint 对吗?

您选择了铅笔工具并开始在画布上做任何事情,无论形状或形状,或者即使您用铅笔做的点是否连接。

现在您选择存储桶工具并开始单击画布。它会做什么?根据您单击的颜色以及她走了多远而不随您在调色板上选择的颜色而改变填充所选区域。

这是我想在我的图片框鼠标点击事件上模拟的行为。

【问题讨论】:

【参考方案1】:

您正在寻找的是一种洪水填充算法。 This 应该可以解决问题。 该算法递归地搜索相邻的未着色像素,直到撞到墙壁。

【讨论】:

【参考方案2】:

您可以使用代码from here:

// Load the image (probably from your stream)
Image image = Image.FromFile( imagePath );
using (Graphics g = Graphics.FromImage(image))

    Color customColor = Color.FromArgb(50, Color.Gray);
    SolidBrush shadowBrush = new SolidBrush(customColor);
    g.FillRectangles(shadowBrush, new RectangleF[]  rectFToFill );

image.Save( imageNewPath );

,但是您错过了一件事 - rectFToFill,您应该根据您的点击事件定义它。有很多策略可以使用,我建议你处理Drag事件之类的,保存事件起点和终点,然后定义你必须填充的矩形:

您应该检查事件点,然后使用 its constructors 的一部分创建 Rectangle(F) 结构。Graphics 类有十几种方法,您可以使用这些方法在 Image 上绘制一些形状或线条。

【讨论】:

如果我知道它在哪里,填充一个矩形或圆形没什么大不了的。除了我不会将鼠标拖到图片框上来定义要填充的形状。例如,我将只单击一个像素,该像素以及连接的其他像素以及连接到它们的共享相同颜色的所有其他像素将变为红色。请参阅我的编辑以更清楚地了解我的目标。感谢您的回复。

以上是关于鼠标单击图片框时图像的着色区域的主要内容,如果未能解决你的问题,请参考以下文章

在裁剪区域外禁用鼠标单击

CSS/HTML:点击时删除图像过滤器

js中多选中单击行能选中,但是单击那个框时不能选中怎么办?

Tkinter:使用鼠标绘制矩形

MFC中如何在指定的区域响应鼠标单击事件

如何仅捕获屏幕上的鼠标单击区域?