Булева растровая операция в .NET? - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть два 8bpp растровых изображения. Я хочу сделать побитовое И одно к другому, но я не вижу очевидного способа сделать это в .NET. Возможно ли сделать это без использования не-.NET методов? Спасибо!

Ответы [ 4 ]

3 голосов
/ 10 февраля 2010

Я думаю, что вы ищете Bitmap.LockBits .

3 голосов
/ 10 февраля 2010

Вы можете попробовать преобразовать растровое изображение в байтовый массив, а затем перебрать байты и объединить их вместе

Редактировать: Провел тест времени на идею цикла:

Пример кода:

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)

1 голос
/ 10 февраля 2010

Вы можете использовать функцию ' BitBlt ', в которой вы можете И источник и назначение ( SRCAND ), подпись pinvoke равна здесь .

Вот статья о Codeproject, которая использует обертку BitBlt здесь .

Надеюсь, это поможет, С уважением, Том.

1 голос
/ 10 февраля 2010

Если производительность не важна, используйте Bitmap.GetPixel и Bitmap.SetPixel

...