我希望能够用给定的颜色填充图像的任何给定区域,就像使用颜色填充矩形,圆形或任何其他颜色分隔的形状一样。
为了使这更简单,我已经使图片框源图像与图片框本身具有相同的大小,这应该会使事情变得更容易。
我是如何做到这一点的,因为我有一个带有图像和已定义颜色的图片框,用户只需要点击图片框就可以填充任何具有这种颜色的区域。
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对吗?
您选择了铅笔工具并开始在画布上做任何事情,无论形状或形状如何,或者即使您使用铅笔做的点是否连接。
现在您选择存储桶工具并开始单击画布。它会做什么?根据您点击的颜色填写所选区域,并根据您在颜色托盘上选择的颜色改变它的距离。
这是我想在我的图片框鼠标点击事件中模仿的行为。
答案 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
事件或类似事件,保存事件起点和终点,然后定义必须填充的矩形:
您应该检查事件点,之后使用its constructors的某些内容创建Rectangle(F)
结构。
Graphics
类有十几种方法可用于在Image
上绘制一些形状或线条。