鼠标点击图片框上的图像着色区域

时间:2014-08-07 10:09:14

标签: c# winforms image-editing

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

为了使这更简单,我已经使图片框源图像与图片框本身具有相同的大小,这应该会使事情变得更容易。

我是如何做到这一点的,因为我有一个带有图像和已定义颜色的图片框,用户只需要点击图片框就可以填充任何具有这种颜色的区域。

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对吗?

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

现在您选择存储桶工具并开始单击画布。它会做什么?根据您点击的颜色填写所选区域,并根据您在颜色托盘上选择的颜色改变它的距离。

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

2 个答案:

答案 0 :(得分:1)

您正在寻找的是泛洪填充算法。 This应该做的很好。 该算法递归地搜索相邻的未着色像素,直到它撞到墙壁。

答案 1 :(得分:0)

您可以使用代码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事件或类似事件,保存事件起点和终点,然后定义必须填充的矩形:

enter image description here

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