.NET中的布尔位图操作?

时间:2010-02-10 16:26:25

标签: .net bitmap boolean

我有两个8bpp位图。我想做一个与另一个的按位,但我没有看到任何明显的方法在.NET中这样做。是否可以在不使用非.NET方法的情况下执行此操作? 谢谢!

4 个答案:

答案 0 :(得分:3)

我认为你正在寻找Bitmap.LockBits

答案 1 :(得分:3)

您可以尝试将位图转换为字节数组,然后循环遍历字节并将它们放在一起

编辑: 对循环理念进行时间测试:

示例代码:

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");

具有以下结果:

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

图像“Image1”和“Image2”为4000 x 2250(从数码相机转换为8位bmp)

答案 2 :(得分:1)

如果性能不重要,请使用Bitmap.GetPixel和Bitmap.SetPixel

答案 3 :(得分:1)

您可以使用'BitBlt'功能,您可以在其中与源和目的地( SRCAND ),pinvoke签名{{3 }}

这是一篇关于使用BitBlt包装器here的Codeproject的文章。

希望这有帮助, 最好的祝福, 汤姆。