1

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

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

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

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

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

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

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

4

2 回答 2

1

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

于 2014-08-07T17:29:46.893 回答
0

您可以使用此处的代码:

// 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 );

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

在此处输入图像描述

您应该检查事件点,然后Rectangle(F)使用它的一些构造函数创建结构。
该类Graphics有十几种方法,您可以使用这些方法在Image.

于 2014-08-07T11:44:29.227 回答