为什么c#位图setPixel()方法不起作用?

时间:2012-01-03 13:14:07

标签: c# bitmap

我有一个方法,它接收一个矩形的数字,并“空白”该区域的像素(将它们变成白色)。出于某种原因,虽然当我的程序搜索非白色像素时,它找到了我刚设置为白色的像素。

为什么说它不是白色的?我有一个被裁剪的图像并保存到我的硬盘中。所以我能够看到它说不是白色的区域,但是当我打开图像时,它可以是完全白色的。所以我很遗憾为什么这不起作用。程序每次都停在相同的像素上。它说R值是238,我知道像素被设置为白色,因为我通过调试器并观察像素值进入bmp.SetPixel方法。

这是“消隐”方法的代码:

void blankArea(int x, int y, int width, int height)
        {
            for (int i = y; i <= height+y; ++i)
                for (int t = x; t <= width+x; ++t)
                {
                    if (t == w)
                        break;
                    bmp.SetPixel(t, i, Color.White);
                }
        }

这是代码表示像素不是白色:

bool allWhiteColumn (int col)
        {
            for (int i = 5; i < h; ++i)
                if (bmp.GetPixel(col - 1, i).R < 248 && bmp.GetPixel(col - 1, i).G < 248)
                {
                    imageBelowColumEnd = bmp.GetPixel(col - 1, i).R;
                    this.row = i;
                    return false;
                }
            return true;
        }

在这一点上的任何帮助将不胜感激。在我将它设置为白色后,我不知道为什么它说R是238。感谢

编辑 - 自从我发表评论后,我会编辑。拿出if,什么也没做。同样的问题。我无法检查纯白色。该程序从扫描仪中找到图像。因此,由于扫描仪“白色”区域不是真白色,我无法寻找Color.WHITE。我会尝试使用bitlock ...

EDIT 2-“尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”当我试图做锁定和解锁位的例子时被抛出。一旦它试图将这些位复制到数组中,它就抛出了它。显然这是不允许的。

感谢您的回答。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用之前的Bitmap.Lockbits()方法,并在更改像素后尝试使用Bitmap.Unlockbits()。

实际上,这是一个例子:http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx

答案 1 :(得分:1)

删除第一个函数中的if (t == w) break;,无论是w(您没有描述)。我想代码中断了,你最终得到了一个不完整的白色区域。

答案 2 :(得分:0)

为初学者检查白色会不会更有意义吗?

bool allWhiteColumn (int col)
{
    for (int i = 5; i < h; ++i)
        if (bmp.GetPixel(col - 1, i) != Color.White)
        {
            imageBelowColumEnd = bmp.GetPixel(col - 1, i).R;
            this.row = i;
            return false;
        }
    return true;
}