我尝试将堆栈类用于油漆桶功能,但是当运行并点击图片框中的选定区域以填充所选颜色时,没有任何反应,CPU使用率达到%100且系统挂起! 这是代码,首先是用于选择此功能的图片框代码和点击后的呼叫填充功能:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (act == "color")
{
fill(bmp ,e.X, e.Y, bmp.GetPixel(e.X, e.Y));
pictureBox1.Image = bmp;
}
}
============================并填写不起作用的功能!
private void fill(Bitmap picture, int x, int y, Color bcolor)
{
if (x > 0 && x < picture.Width && y > 0 && y < picture.Height)
{
Point p = new Point(x, y);
Stack<Point> s = new Stack<Point>();
s.Push(p);
while (s.Count > 0)
{
p = s.Pop();
Color currentcolor = picture.GetPixel(p.X, p.Y);
if (currentcolor == bcolor)
{
//this.Refresh();
picture.SetPixel(p.X, p.Y, currentcolor);
s.Push(new Point(p.X - 1, p.Y));
s.Push(new Point(p.X + 1, p.Y));
s.Push(new Point(p.X, p.Y - 1));
s.Push(new Point(p.X, p.Y + 1));
}
}
}
}
有什么想法解决这个问题吗? 感谢
---其实我删除了“this.Refresh()”代码,但结果仍然相同,没有任何改变!那么,是否有任何修改或更好的油漆桶代码的建议?
答案 0 :(得分:0)
你不能只是这样称呼:
s.Push(new Point(p.X - 1, p.Y));
s.Push(new Point(p.X + 1, p.Y));
s.Push(new Point(p.X, p.Y - 1));
s.Push(new Point(p.X, p.Y + 1));
...而不检查每个p.X +/- 1
&amp;&amp; p.Y +/- 1
在Bitmap
的范围内,否则你弹出的每个像素都会推动4.这会增加堆栈,直到你的内存不足为止。
this.Refresh()
可能使代码运行得如此之慢,以至于您没有看到实际的内存耗尽 - 因此100%的CPU。您应该删除this.Refresh()
,因为在fill
方法完成之前您的UI无法更新。