J'ai deux bitmaps 8bpp. Je veux faire un ET bit à bit de l'un à l'autre, mais je ne vois aucune façon évidente de le faire dans .NET. Est-il possible de le faire sans utiliser les méthodes non-NET? Merci!Opération bitmap booléenne dans .NET?
Répondre
Je pense que vous êtes à la recherche Bitmap.LockBits.
Je peux devoir recourir à ceci si je ne peux pas trouver une méthode de bibliothèque qui le fait. Malheureusement, la boucle en C# s'exécutera probablement plus lentement. – user20493
Si les performances ne sont pas importantes, utilisez Bitmap.GetPixel et Bitmap.SetPixel
Malheureusement, ceux-ci sont très lents dans .NET. – user20493
Vous pouvez essayer de convertir le bitmap à un tableau d'octets et boucle à travers les octets anding-les ensemble
Edit: a publié 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 (à partir d'un appareil photo numérique converti en 8 bits bmp)
Une approche intéressante. Malheureusement, la mise en boucle est lente en C#. – user20493
Vous pouvez utiliser la fonction « BitBlt », dans lequel vous pouvez et la source et la destination (SRCAND), la signature pinvoke est here.
Voici un article sur Codeproject qui utilise un wrapper BitBlt here.
Espérons que cela aide, Cordialement, Tom.
Il a demandé de le faire sans utiliser de méthodes non-NET. –
@Matthew ... malheureusement ... il ya une dépendance sur pinvoke pour faire des choses que .NET ne peut pas faire .... – t0mm13b
Il n'y a aucune raison .NET ne peut pas faire cela. –
- 1. "Coloriser" un bitmap dans .NET
- 2. Convertir une condition booléenne complexe de chaîne en booléenne .NET
- 3. Opération de table Bibliothèque .net
- 4. Question sur l'enregistrement bitmap dans .NET
- 5. expression booléenne dans SQL
- 6. Qu'est-ce qu'une "opération d'E/S asynchrones" dans .NET?
- 7. .net limitations de type de fichier bitmap
- 8. Comment vérifier si MemoryStream peut convertir en Bitmap dans .NET?
- 9. .NET Framework 4 dans WPF ne montre pas l'effet bitmap
- 10. Défilement automatique ou déplacement d'un bitmap dans .NET
- 11. Contrôle de la visibilité d'un bitmap dans .NET
- 12. Copie bitmap dans d'autres bitmap avec WPF
- 13. Expression booléenne
- 14. booléenne dans les critères requête
- 15. Valeur booléenne Bind dans Sqlite
- 16. équation booléenne
- 17. .Net Linq - Faire une opération sur le sous-ensemble
- 18. Lecture de couleurs bitmap bitmap monochrome
- 19. Comment créer .NET Bitmap à partir de données BGR
- 20. C# .NET Convertir une image JPEG en une structure Bitmap
- 21. Sortie booléenne JSF
- 22. php Aide booléenne
- 23. Vitesse d'expression booléenne (C#)
- 24. Cellule booléenne DataView
- 25. Comment convertir booléenne Chaîne
- 26. Vérification, opération réussie après toute opération LinqToSql
- 27. Erreur de logique booléenne
- 28. Opération abandonnée dans IE 7
- 29. Opération Asynch dans l'application WinForm
- 30. Obtenir Bitmap Handle (IntPtr) de byte [] en utilisant C# .net
Est-ce que 8bpp est indexé? Cela signifie qu'il y a 256 couleurs, mais/which/they sont spécifiées dans une table distincte dans laquelle chaque pixel est indexé. .NET appelle ceci Format8bppIndexed. –
Non, ce n'est qu'un canal extrait d'une image plus profonde. – user20493
Hmm, je ne suis pas sûr que ce soit l'une des valeurs PixelFormat supportées. –