La lecture bitmap monochrome couleurs des pixels

Je ne sais pas un meilleur titre, mais je vais vous décrire le problème.

Un morceau de matériel que nous utilisons a la capacité d'afficher des images.
Il peut afficher une image en noir et blanc avec une résolution de 64 × 256.

Le problème est le format de l'image que nous avons de les envoyer à l'appareil.
Ce n'est pas un standard format bitmap, mais au lieu de cela, il est tout simplement un tableau de
octets représentant de chaque pixel de l'image.

0 = noir, 1 = blanc.

Ainsi, si nous avions une image avec la taille: 4 x 4 le tableau d'octets pourrait ressembler à quelque chose comme:

1000 0100 0010 0001

Et l'image devrait ressembler à:

Bitmap http://www.mediafire.com/imgbnc.php/6ee6a28148d0170708cb10ec7ce6512e4g.jpg

Le problème est que nous avons besoin pour créer cette image par la création d'un bitmap monochrome
en C# et puis convertir le fichier en format compris par l'appareil.

Par exemple, on peut afficher du texte sur l'appareil. Pour ce faire, il serait
créer un bitmap et d'écrire du texte à:

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:

  1. Le bitmap généré n'est pas monochrome
  2. Le bitmap généré a un autre format binaire

J'ai donc besoin d'un moyen de:

  1. Générer une image bitmap monochrome .NET
  2. Lire les pixels individuels de couleurs pour chaque pixel de l'image bitmap

J'ai trouvé que vous pouvez régler la profondeur de pixel de 16, 24 ou 32 bits, mais je n'ai pas trouvé monochrome et je n'ai aucune idée de comment lire les données de pixel.

Suggestions sont les bienvenues.

Mise à JOUR: je ne peux pas utiliser Win32 PInvokes... qui doit être plate-forme neutre!

SUIVI: Le code suivant fonctionne pour moi maintenant. (Juste au cas où quelqu'un 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;
}

OriginalL'auteur TimothyP | 2009-03-02