Frage

Ich weiß nicht, einen besseren Titel, aber ich werde das Problem beschreiben.

Ein Stück Hardware, die wir verwenden, hat die Fähigkeit, Bilder anzuzeigen. Es kann mit einer Auflösung von 64 x 256 ein Schwarz-Weiß-Bild angezeigt werden soll.

Das Problem ist das Format des Bildes wir an das Gerät zu senden. Es ist kein Standard-Bitmap-Format, sondern es ist einfach eine Reihe von Bytes jedes Pixel des Bildes darstellt.

0 = schwarz, 1 = weiß.

Also, wenn wir ein Bild mit der Größe hatte: 4 x 4 das Byte-Array könnte etwas wie folgt aussehen:

1000 0100 0010 0001

Und das Bild würde wie folgt aussehen:

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

Das Problem ist, dass wir dieses Bild schaffen müssen durch eine monochrome Bitmap Erstellen in C # und wandelt sie dann in das Dateiformat von dem Gerät verstanden.

Zum Beispiel könnte man Text auf dem Gerät angezeigt werden soll. Um das zu tun, damit er müssen eine Bitmap erstellen und schreiben Text ihm:

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);
}

Es gibt zwei Probleme hier:

  1. Die erzeugte Bitmap wird nicht monochrom
  2. Die erzeugte Bitmap hat eine andere Binärformat

Also brauche ich einen Weg:

  1. Erstellen Sie ein Monochrom-Bitmap in .NET
  2. Lesen Sie die einzelnen Pixelfarben für jedes Pixel in der Bitmap

Ich habe festgestellt, dass Sie die Pixeltiefe auf 16, 24 oder 32 Bits eingestellt werden, aber noch nicht monochrome gefunden und ich habe keine Ahnung, wie die Pixeldaten zu lesen.

Vorschläge sind willkommen.

UPDATE: Ich kann nicht Win32 PInvokes verwenden ... hat Plattform neutral sein

!

VORGEHEN: Der folgende Code jetzt für mich arbeitet. (Für den Fall, jemand muss es)

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;
}
War es hilfreich?

Lösung

ich die Helligkeit jeden Pixel berechnen würde ein dann vergleichen Sie es mit einem gewissen Schwellenwert ist.

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

Sagen Sie den Schwellenwert 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;
  }
}

Andere Tipps

Ich weiß, C # nicht. Sind möglicherweise viele Möglichkeiten, es zu tun. Hier ist eine einfache Art und Weise.

  1. Erstellen Sie ein leeres schwarzes Bitmap-Bild der Größe gleich das Gerät erforderlich. Malen sie, was ihr wollt, wie Text zeichnen, Zahlen etc.

  2. Jetzt Schwellenwert das Bild d.h. die Pixel des Bildes unter einem Intensitätswert auf Null gesetzt, sonst setzt ihn auf. z.B. gesetzt, alle Intensitätswerte> 0 bis 1 ist.

  3. Sie nun in das Format konvertieren, indem Sie Ihr Gerät erforderlich. Erstellen eines Byte-Array der Größe (64 * 256) / 8. Stellen Sie die entsprechenden Bits auf 1, wo die entsprechenden Pixelwerte in früheren Bitmap 1 sind, sonst zurückgesetzt sie auf 0.

Edit: Schritt 3. Verwenden Sie Bitoperatoren die Bits setzen

.

Sie sollten nicht GetPixel Methode Ihrer Bitmap verwenden, um ganze Bitmap von einem Format in ein anderes zu konvertieren! Dies wird unwirksam. Stattdessen sollten Sie LockBits Methode, um Zugriff auf eine Kopie des Bildes verwenden Puffer und wandeln sie in die gewünschten Format. Ich bin mir nicht ganz sicher, es zu Schwarz-Weiß konvertieren, aber es gibt Format1bppIndexed Wert in Pixelformat-Enumeration, die Ihnen helfen kann.

Sie können versuchen, eine Pixelformat im Konstruktor zu liefern:

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

Wenn ich monochrome tat Bitmaps auf anderen Plattformen zeichne ich manchmal hatte deaktivieren Anti-Aliasing oder der gerenderte Text nicht angezeigt:

graphics.SmoothingMode=SmoothingMode.None;

YMMV.

Bitmap hat eine GetPixel Methode dass Sie verwenden können. Damit können Sie auf die Bitmap zeichnen und später konvertieren zu dem Format, das Sie benötigen.

Bitmaps in Windows Forms (dh durch Graphics.FromImage zugegriffen wird) sind 24 bpp (vielleicht 32? Es ist zu früh, und ich ehrlich vergessen). Nichtsdestotrotz gibt GetPixel ein Color-Objekt, so dass die Bit-Tiefe des Bitmaps ist unwesentlich. Ich schlage vor, Sie schreiben Ihren Code wie folgt:

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);
}

Dieses Verfahren ist einfach Schwellwertbildung genannt. Es ist hirntot, aber es wird als ein erster Schnitt arbeiten.

Dank für den oben genannten Code - Ich versuche, ein monochromes Bild in eine 2D-Array zu konvertieren, wobei 1-schwarz 0-weiß aber ich einige Probleme mit - ich Ihren Code verwendet, um eine 8x8 bmp Bild zu laden, und bin seinen Inhalt auf eine Textbox zur Ausgabe von mit

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

jedoch bekomme ich dies als ein Ergebnis in der Textbox:

225  231  231  231  231  129  255  

Wie bekomme ich es so ist es 0 und 1 ist?

Diese chap einen Code hat, die eine Mono-Bitmap erzeugt. Die Probe ist Saveimage derjenige von Interesse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top