在每个像素中移动1bpp像素格式

时间:2014-01-29 12:01:27

标签: c# lockbits

我有一个与在C#中使用Lockbits方法有关的问题。 我有一个1bpp图像,我试图访问图像的所有像素,但有些仍然被遗漏。

    public Bitmap Pixels(Bitmap original)
        {
    Rectangle rect = new Rectangle(0, 0, original.Width, original.Height);
                BitmapData bimgData = original.LockBits(rect, ImageLockMode.ReadWrite, original.PixelFormat);

            IntPtr ptr = bimgData.Scan0;

            int bytes = bimgData.Stride * bimg.Height;
            byte[] Values = new byte[bytes];

            Marshal.Copy(ptr, Values, 0, bytes);

            int Val;
            int stride = bimgData.Stride;
for (int column = 0; column < bimgData.Height; column = column + 1)
                    for (int row = 0; row < bimgData.Width; row = row +1)
                    {
                        c = column;
                        r = row;
                        for (int t = 0; t < 8; t++)
                        {
                           Val = Values[((c) * stride) + ((r) / 8)] & 2 ^ t;
                           if (Val == 0)
                                Values[((c) * stride) + ((r) / 8)] = (byte)(Values[((c) * stride) + ((r) / 8)] + 2 ^ t);
                        }
                    }
Marshal.Copy(Values, 0, ptr, bytes);
            original.UnlockBits(bimgData);

            return original;
        }

此代码应将所有像素变为白色

1 个答案:

答案 0 :(得分:0)

   Val = Values[((c) * stride) + ((r) / 8)] & 2 ^ t;

2 ^ t没有做你希望它做的,这是Visual Basic语法。在C#语言中,^是XOR运算符。使用&lt;&lt;而不是运算符,并使用括号来处理运算符优先级。修正:

   Val = Values[((c) * stride) + ((r) / 8)] & (1 << t);

当你设置位时再次修复它。

请注意,将整个图像转换为白色根本不需要这种代码。只需将所有字节设置为0xff。