0 votes

Opérations booléennes sur les bitmaps en .NET ?

J'ai deux bitmaps de 8bpp. Je veux faire un ET bit à bit de l'un à l'autre, mais je ne vois pas de moyen évident de le faire en .NET. Est-il possible de le faire sans utiliser des méthodes non .NET ? Merci !

3voto

Matthew Flaschen Points 131723

Je pense que vous cherchez Bitmap.LockBits .

3voto

James Barrass Points 5022

Vous pouvez essayer de convertir le Bitmap en un tableau d'octets, puis de boucler sur les octets et de les assembler.

Edit : J'ai fait un test de temps sur l'idée de la boucle :

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

avec les résultats suivants :

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

Les images "Image1" et "Image2" étaient 4000 x 2250 (d'un appareil photo numérique converti en bmp 8 bits).

1voto

Pavel Alexeev Points 1680

Si les performances ne sont pas importantes, utilisez Bitmap.GetPixel et Bitmap.SetPixel.

1voto

t0mm13b Points 21031

Vous pouvez utiliser l'option ' BitBlt dans laquelle vous pouvez ET la source et la destination ( SRCAND ), la signature pinvoke est aquí .

Voici un article sur Codeproject qui utilise un wrapper BitBlt aquí .

J'espère que cela vous aidera, Meilleures salutations, Tom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X