Question

Je ne connais pas de meilleur titre, mais je vais décrire le problème.

Nous utilisons un matériel qui permet d’afficher 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. Ce n'est pas un format bitmap standard, mais plutôt un tableau de octets représentant chaque pixel de l'image.

0 = noir, 1 = blanc.

Donc, si nous avions une image de la taille suivante: 4 x 4, le tableau d'octets pourrait ressembler à ceci:

1000 0100 0010 0001

Et l'image ressemblerait à:

Carte bitmap http://www.mediafire.com/imgbnphp/6e614 jpg

Le problème est que nous devons créer cette image en créant un bitmap monochrome. en C #, puis convertissez-le au format de fichier compris par le périphérique.

Par exemple, il est possible d’afficher du texte sur le périphérique. Pour ce faire, il voudrait créer une bitmap et y é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 format binaire différent

Il me faut donc un moyen de:

  1. Générer un bitmap monochrome dans .NET
  2. Lire les couleurs de pixel individuelles pour chaque pixel du bitmap

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

Les suggestions sont les bienvenues.

UPDATE: je ne peux pas utiliser Win32 PInvokes ... doit être neutre sur le plan de la plate-forme!

SUIVI: le code suivant fonctionne pour moi maintenant. (Juste au cas où quelqu'un en aurait 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;
}
Était-ce utile?

La solution

Je calculais la luminance de chaque pixel puis je la comparais à une valeur de seuil.

y=0.3*R+0.59G*G+0.11*B

Dites que la valeur de seuil est 127:

const int threshold = 127;
Bitmap bm = { some source bitmap };

byte[,] buffer = new byte[64,256];

for(int y=0;y<bm.Height;y++)
{
  for(int x=0;x<bm.Width;x++)
  {
   Color c=source.GetPixel(x,y);
   int luminance = (int)(c.R*0.3 + c.G*0.59+ c.B*0.11);
   buffer[x,y] = (luminance  > 127) ? 1 : 0;
  }
}

Autres conseils

Je ne sais pas C #. Il y a peut-être plusieurs façons de le faire. Voici un moyen simple.

  1. Créez une image bitmap noire vierge de taille égale à celle de votre périphérique. Dessinez dessus ce que vous voulez dessiner comme du texte, des figures, etc.

  2. Définissez maintenant un seuil pour l'image, c.-à-d. définissez le pixel de l'image sous une valeur d'intensité sur zéro, sinon définissez-le sur. par exemple. définir toutes les valeurs d'intensité > 0 à 1.

  3. Convertissez maintenant au format requis par votre appareil. Créez un tableau d'octets de la taille (64 * 256) / 8. Définissez les bits correspondants sur 1, où les valeurs de pixel correspondantes dans le bitmap précédent sont égales à 1, sinon remettez-les à 0.

Éditer: Étape 3. Utilisez les opérateurs au niveau des bits pour définir les bits.

Vous ne devriez pas utiliser la méthode GetPixel de votre bitmap pour convertir une bitmap entière d'un format à un autre! Ce sera inefficace. Utilisez plutôt la méthode LockBits pour obtenir l'accès à une copie de l'image. tampon et le convertir au format souhaité. Je ne suis pas tout à fait sûr de le convertir en monochrome, mais il existe une valeur Format1bppIndexed dans l'énumération PixelFormat qui peut vous aider.

Vous pouvez essayer de fournir un pixelformat dans le constructeur:

var bitmap = new Bitmap(256, 64, PixelFormat.Format1bppIndexed);

Quand j’ai dessiné des bitmaps monochromes sur d’autres plateformes, j’avais parfois désactiver l'anticrénelage ou le texte affiché ne s'afficherait pas:

graphics.SmoothingMode=SmoothingMode.None;

YMMV.

Bitmap utilise une méthode GetPixel . que vous pouvez utiliser. Cela vous permettra de dessiner sur le bitmap et de le convertir ultérieurement au format dont vous avez besoin.

Les images bitmap dans les formulaires Windows (c’est-à-dire accessibles via Graphics.FromImage) ont 24 bpp (peut-être 32? C’est trop tôt et j’oublie franchement). Néanmoins, GetPixel retourne un objet Color, de sorte que la profondeur de bits de l'image bitmap est immatérielle. Je vous suggère d'écrire votre code comme ceci:

MyBitmapFormat ToMyBitmap(Bitmap b)
{
    MyBitmapFormat mine = new MyBitmapFormat(b.Width, b.Height);

    for (int y=0; y < b.Height; y++) {
        for (int x=0; x < b.Width; x++) {
            mine.SetPixel(x, y, ColorIsBlackish(b.GetPixel(x, y)));
        }
    }
}

bool ColorIsBlackish(Color c)
{
    return Luminance(c) < 128; // 128 is midline
}

int Luminance(c)
{
    return (int)(0.299 * Color.Red + 0.587 * Color.Green + 0.114 * Color.Blue);
}

Ce processus s'appelle le seuillage simple. C'est braindead, mais cela fonctionnera comme une première coupe.

merci pour le code ci-dessus - j'essaye de convertir une image monochrome en un tableau 2D où 1-noir 0-blanc mais j'ai quelques problèmes - j'ai utilisé votre code pour charger une image 8x8 bmp, et afficher son contenu dans une zone de texte en utilisant

myGrid =GetLedBytes(myBmp);
     for (int x = 1; x < 8; x++)
     {
         textBox1.Text = textBox1.Text + Convert.ToString(myGrid[x])+ "  ";
     }

mais je reçois ceci comme résultat dans la zone de texte:

225  231  231  231  231  129  255  

comment puis-je l'obtenir de sorte qu'il est 0 et 1?

Ce chapitre contient du code qui crée un bitmap mono. L’exemple SaveImage est celui qui nous intéresse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top