0

我有一个关于在 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;
        }

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

4

1 回答 1

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

2 ^ t不会做你希望做的事,这是 Visual Basic 语法。在 C# 语言中,^ 是 XOR 运算符。请改用 << 运算符并使用括号来处理运算符的优先级。使固定:

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

并在您设置位时再次修复它。

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

于 2014-01-29T12:42:25.447 回答