Je ne connais pas un meilleur titre, mais je vais décrire le problème.Lecture de couleurs bitmap bitmap monochrome
Un composant que nous utilisons peut présenter des images. Il peut afficher une image en noir et blanc avec une résolution de 64 x 256.
Le problème est le format de l'image que nous devons envoyer à l'appareil. Il ne s'agit pas d'un format bitmap standard, mais plutôt d'un tableau de octets représentant chaque pixel de l'image.
0 = noir, 1 = blanc.
Donc, si nous avions une image avec la taille: 4 x 4 du tableau d'octets pourrait ressembler à:
Et l'image ressemblerait à ceci:
Bitmap http://www.mediafire.com/imgbnc.php/6ee6a28148d0170708cb10ec7ce6512e4g.jpg
Le problème est que nous devons créer cette image en créant un bitmap monochrome en C#, puis le convertir au format de fichier compris par le périphérique.
Par exemple, il est possible d'afficher du texte sur l'appareil. Pour ce faire, il aurait devoir créer un bitmap et écrire un texte à lui:
var bitmap = new Bitmap(256, 64);
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.DrawString("Hello World", new Font("Courier", 10, FontStyle.Regular), new SolidBrush(Color.White), 1, 1);
}
Il y a 2 problèmes ici:
- Le bitmap généré n'est pas monochrome
- généré bitmap a un format binaire différent
donc je besoin d'un moyen de:
- Générer un bitmap monochrome dans .NET
- Lire les couleurs de pixels individuels pour chaque pixel dans l'image bitmap
J'ai trouvé que vous pouvez régler la profondeur de pixel à 16, 24 ou 32 bits, mais n'ont pas trouvé monochrome et je n'ai aucune idée de comment lire les données de pixel.
Les suggestions sont les bienvenues.
MISE À JOUR: Je ne peux pas utiliser Win32 PInvokes ... doit être plate-forme neutre!
SUIVI: Le code suivant fonctionne pour moi maintenant. (Juste au cas où tout le monde en a besoin)
private static byte[] GetLedBytes(Bitmap bitmap)
{
int threshold = 127;
int index = 0;
int dimensions = bitmap.Height * bitmap.Width;
BitArray bits = new BitArray(dimensions);
//Vertically
for (int y = 0; y < bitmap.Height; y++)
{
//Horizontally
for (int x = 0; x < bitmap.Width; x++)
{
Color c = bitmap.GetPixel(x, y);
int luminance = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
bits[index] = (luminance > threshold);
index++;
}
}
byte[] data = new byte[dimensions/8];
bits.CopyTo(data, 0);
return data;
}
Pointez pour ça! Mais si vous utilisez Bitmap.LockBits au lieu de Bitmap.GetPixel vous obtenez des performances supérieures! –
Thnx! Avec quelques ajustements mineurs, ce code fonctionne comme un charme :-) – TimothyP
danbystrom: Vous avez raison de vouloir garder l'exemple de code aussi propre et sans pointeur que possible. – arul