2014-01-29 38 views
0

我有一个问题,在C#中使用Lockbits方法.. 我有一个1bpp图像,我试图访问图像的所有像素,但仍有一些出。移动通过每个像素为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
Val = Values[((c) * stride) + ((r)/8)] & 2^t; 

2^t像素不会做你希望它做什么,这是Visual Basic语法。在C#语言中,^是XOR运算符。改为使用< <运算符,并使用括号来处理运算符优先级。修复:

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

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

请注意,将整个图像转换为白色并不需要这种类型的代码。只需将所有字节设置为0xff即可。

+0

谢谢!!!!我只是暂时把像素变成白色来理解代码...... – Afifa