C#中的油漆桶功能代码,运行时挂起,

时间:2016-01-18 22:39:37

标签: c# stack paint bucket

我尝试将堆栈类用于油漆桶功能,但是当运行并点击图片框中的选定区域以填充所选颜色时,没有任何反应,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()”代码,但结果仍然相同,没有任何改变!那么,是否有任何修改或更好的油漆桶代码的建议?

1 个答案:

答案 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 +/- 1Bitmap的范围内,否则你弹出的每个像素都会推动4.这会增加堆栈,直到你的内存不足为止。

this.Refresh()可能使代码运行得如此之慢,以至于您没有看到实际的内存耗尽 - 因此100%的CPU。您应该删除this.Refresh(),因为在fill方法完成之前您的UI无法更新。