Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

byte array zu 1bpp Bitmap Problem

23 views
Skip to first unread message

Sven Bauermann

unread,
Nov 14, 2011, 5:48:39 AM11/14/11
to
Hallo,

nachdem ich mit probieren ordentlich Zeit verloren habe und meine Ideen
ausgehen, poste ich mal meine Sorgen.

Einleitung:
Aus einem Nistfile (Biometric Standard File) werden aus einem Record 8,
Datenfelder ausgelesen. Ab der Bytestelle 13 bis 62512 liegt ein Bild.
Durch die Spezifikation wird ein 1000 x 500 Pixel gr��es Bild, mit einer
Aufl�sung von 500ppi erwartet. 8 Pixel wurden in ein byte gepackt. Das
Bild ist unkomprimiert. Es handelt sich also um ein Black and White Bild
was bei Unterschriften Bildern auch zu erwarten ist. Das Bild ist exact
62500 byte gro�. Bei 8 Pixel f�r ein byte, steht jedes Bit f�r ein Pixel
als 62500 x 8 = 500.000 Pixel. V�llig korrekt bis hier. Leider liefert
der aus meiner Sicht korrekt Code ein Bild mit wei�en Hintergrund und
einigen sch�n verteilten schwarzen Strichen, keine Unterschrift.

Ich habe ausgeschlossen, dass es sich bei den BitmapData Werten um
Schrott handelt. Ich habe mit einem Freeware Nistviewer (Cognaxon), das
File ge�ffnet und die Unterschrift ordentlich dargestellt.Lediglich der
Hintergrund ist schwarz und die Schrift wei�. Ich habe keine Idee wieso,
das bei meinem Versuch nicht so ist.

Vielen Dank f�r Ideen und Hilfe
Gru� Sven

Hier mein Code:

Aufruf:
XImage = CopyDataToBitmap(rawdata, _HLL, _VLL,
PixelFormat.Format1bppIndexed);

protected Bitmap CopyDataToBitmap(byte[] data, int pWidth, int pHeight,
PixelFormat pPix)
{
//here create the bitmap to the know height, width and
format
Bitmap bmp = new Bitmap(pWidth, pHeight, pPix);
//bmp.SetResolution(500.0F, 500.0F);

//create a bitmapdata and lock all pixel to be written
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
bmp.Width, bmp.Height),
ImageLockMode.WriteOnly, bmp.PixelFormat);

//Copy the data from the byte array into BitmapData.Scan0
Marshal.Copy(data, 0, bmpData.Scan0, data.Length);

//unlock the pixel
bmp.UnlockBits(bmpData);

bmp.Save(@"C:\Sigantur.bmp",ImageFormat.Bmp);

//return the bitmap
return bmp;
}

Uwe Hercksen

unread,
Nov 14, 2011, 10:49:08 AM11/14/11
to


Sven Bauermann schrieb:

> Aus einem Nistfile (Biometric Standard File) werden aus einem Record 8,
> Datenfelder ausgelesen. Ab der Bytestelle 13 bis 62512 liegt ein Bild.
> Durch die Spezifikation wird ein 1000 x 500 Pixel größes Bild, mit einer
> Auflösung von 500ppi erwartet. 8 Pixel wurden in ein byte gepackt. Das
> Bild ist unkomprimiert. Es handelt sich also um ein Black and White Bild
> was bei Unterschriften Bildern auch zu erwarten ist. Das Bild ist exact
> 62500 byte groß. Bei 8 Pixel für ein byte, steht jedes Bit für ein Pixel
> als 62500 x 8 = 500.000 Pixel. Völlig korrekt bis hier. Leider liefert
> der aus meiner Sicht korrekt Code ein Bild mit weißen Hintergrund und
> einigen schön verteilten schwarzen Strichen, keine Unterschrift.

Hallo,

unter Windows sind Bitmap Bilder drei Byte pro Pixel, jeweils ein Byte
für Rot, Grün und Blau Wert. In Deinem NistFile sind aber nur schwarz
oder weiß Pixel, dazu noch 8 Pixel in einem Byte.
Diese verschiedenen Darstellungen musst Du entsprechend selbst per
Programm umwandeln, also für jedes Pixel ein Bit extrahieren und daraus
3 Bytes machen.

Bye

Sven Bauermann

unread,
Nov 14, 2011, 11:19:24 AM11/14/11
to

> Hallo,
>
> unter Windows sind Bitmap Bilder drei Byte pro Pixel, jeweils ein Byte
> f�r Rot, Gr�n und Blau Wert. In Deinem NistFile sind aber nur schwarz
> oder wei� Pixel, dazu noch 8 Pixel in einem Byte.
> Diese verschiedenen Darstellungen musst Du entsprechend selbst per
> Programm umwandeln, also f�r jedes Pixel ein Bit extrahieren und
> daraus 3 Bytes machen.
>
> Bye

Hallo Uwe,

danke Dir f�r die Nachricht. Das war sogar mal mein erster Gedanke,
aber da es das PixelFormat.Format1bppIndexed gibt, ging ich davon aus das
das dann automatisch passiert, bzw das Windows das Bit pro Pixel Format
dann eben kennt!?. Wobei ich bei dem Anh�ngsel Indexed schon Magenschmerzen
hatte. Aber ich dachte, das genau diese Zuordung aus meinem BitmapData
erfolgt, wenn ich das Bitmap mit dem PixelFormat Format1bppIndexed angebe.
Deiner Info nach klappt das dann wohl leider nicht ohne Handarbeit?

Gru� Sven

Uwe Hercksen

unread,
Nov 15, 2011, 4:43:33 AM11/15/11
to


Sven Bauermann schrieb:
>
> danke Dir für die Nachricht. Das war sogar mal mein erster Gedanke,
> aber da es das PixelFormat.Format1bppIndexed gibt, ging ich davon aus das
> das dann automatisch passiert, bzw das Windows das Bit pro Pixel Format
> dann eben kennt!?. Wobei ich bei dem Anhängsel Indexed schon Magenschmerzen
> hatte. Aber ich dachte, das genau diese Zuordung aus meinem BitmapData
> erfolgt, wenn ich das Bitmap mit dem PixelFormat Format1bppIndexed angebe.
> Deiner Info nach klappt das dann wohl leider nicht ohne Handarbeit?

Hallo,
das PixelFormat.Format1bppIndexed kenne ich nicht, aber ich habe auch
bisher nicht unter Vista und Windows 7 und mit den neuesten C# .NET
Versionen programmiert.

Ich würde vorschlagen Du probierst erst mal synthetische Bitmap Bilder
zu erzeugen und anzuzeigen. Einfach mit ein paar Laufschleifen das ganze
Bild auf schwarz setzen und dann ein paar weiße wagrechte und senkrechte
Linien mit Laufschleifen ziehen, evtl. auch 45 °. Da bekommst Du schnell
einen Eindruck wie es geht und ob es so funktioniert. Bei Windows ist
übrigens der Ursprung des Bildes oben links.

Im C# 2005 Codebook steht ein ganze Kapitel über solche Operationen an
Bitmap Bildern, das würde ich Dir empfehlen.

Viel Erfolg,

Bye

Sven Bauermann

unread,
Nov 16, 2011, 4:24:32 AM11/16/11
to
Danke sehr für den Buch Tip.
Es hat geklappt. Ich habe 62500 byte. Jedes byte 8 bit, jeder bit (Schwarz
oder Weiß) 3 byte RGB 255 255 255 oder 0 0 0 für ein Pixel ergibt bei 1000
x 500 = (1000*3) * 500 = 1.500.000 byte bei 24-bit RGB Bitmap. Eine kleine
Hürde war noch, das die bit von 0 - 7 rückwärts ausgelesen werden müssen.

Gruß
Sven

Uwe Hercksen

unread,
Nov 17, 2011, 10:17:24 AM11/17/11
to


Sven Bauermann schrieb:
Hallo,

ja es gibt ja zwei mögliche Richtungen die Bits eines Bytes zu
numerieren, manchmal bekommt man es mit einer Situation zu tun wo
wirklich beide Richtungen benutzt werden. Das ist mir mal vor 30 Jahren
passiert, seitdem achte ich da immer darauf wo LSB und MSB sein sollen.
Ein Byte per Programm spiegeln zu müssen ist ganz übel, da sorge ich
doch lieber dafür das die Hardware richtig herum angeschlossen wird.

Schön das es jetzt geklappt hat und danke für die Rückmeldung. Das
PixelFormat.Format1bppIndexed war wohl eher irreführend, Du hast jetzt
ja offensichtlich das 24 Bit RGB Format benutzt.

Bye

0 new messages