我有一个与在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;
}
此代码应将所有像素变为白色
答案 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。