Tutorial :Boolean bitmap operation in .NET?



Question:

I have two 8bpp bitmaps. I want to do a bitwise AND of one to the other, but I don't see any obvious way to do this in .NET. Is it possible to do this without using non-.NET methods? Thanks!


Solution:1

I think you're looking for Bitmap.LockBits.


Solution:2

You could try converting the Bitmap to a Byte array and then loop through the bytes anding them together

Edit : Ran a Time Test on the loop idea:

Example Code:

DateTime StartTime = DateTime.Now;  Image Image1 = Image.FromFile("C:\\Image1.bmp");  Image Image2 = Image.FromFile("C:\\Image2.bmp");  DateTime AfterLoad = DateTime.Now;  MemoryStream S = new MemoryStream();  Image1.Save(S, System.Drawing.Imaging.ImageFormat.Bmp);  Byte[] I1 = S.ToArray();  Image2.Save(S, System.Drawing.Imaging.ImageFormat.Bmp);  Byte[] I2 = S.ToArray();  DateTime AfterConvert = DateTime.Now;  DateTime AfterLoop = DateTime.Now;  if (I1.Length == I2.Length)  {      Byte[] I3 = new Byte[I1.Length];      for (int i = 0; i < I1.Length; i++)          I3[i] = Convert.ToByte(I1[i] & I2[i]);      AfterLoop = DateTime.Now;      FileStream F = new FileStream("C:\\Users\\jamesb\\desktop\\Image3.bmp", FileMode.OpenOrCreate);      F.Write(I3, 0, I3.Length);      F.Close();  }  DateTime Finished = DateTime.Now;  MessageBox.Show("Load Time: " + (AfterLoad - StartTime).TotalMilliseconds.ToString() + " ms" + "\r\n" +                  "Convert Time: " + (AfterConvert - AfterLoad).TotalMilliseconds.ToString() + " ms"+ "\r\n" +                  "Loop Time: " + (AfterLoop - AfterConvert).TotalMilliseconds.ToString() + " ms"+ "\r\n" +                  "Save Time: " + (Finished - AfterLoop).TotalMilliseconds.ToString() + " ms"+ "\r\n" +                  "Total Time: " + (Finished - StartTime).TotalMilliseconds.ToString() + " ms");  

with the following results :

Load Time: 30.003 ms  Convert Time: 94.0094 ms  Loop Time: 128.0128 ms  Save Time: 177.0177 ms  Total Time: 429.0429 ms  

The images "Image1" and "Image2" were 4000 x 2250 (From a digital camera converted to 8 bit bmp)


Solution:3

If performance is not important, use Bitmap.GetPixel and Bitmap.SetPixel


Solution:4

You can use the 'BitBlt' function, in which you can AND the source and destination (SRCAND), the pinvoke signature is here.

Here is an article on Codeproject that uses a BitBlt wrapper here.

Hope this helps, Best regards, Tom.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »