BMP-Header

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

BMP-Header

Beitrag von Mathias »

Ich bin gerade mit einem BNP-Header am basteln.

Mit folgenden Code wird wie erwartet eine BMP-Date erstellt, welche 2x2 Pixel hat. Was mir ein Rätsel ist, ist biSize, welches ich ausgeklammert habe.
Gemäss Doku https://de.wikipedia.org/wiki/Windows_Bitmap & https://msdn.microsoft.com/de-de/library/dd183376(en-us,VS.85).aspx dürfte dieser '0' sein. Aber wen dieser '0' ist, kann die kommt bei xViewer ein Header-Fehler. Auc kommt dieser Fehler, wen ich dies Datengrösse angeben.
Nur bei '40 ' geht es. Auf den Wert '40' bin ich gekommen, weil ich eine bestehende BMP angeguckt habe.

Wieso ? :?:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  dk: TDateiKopf;
  ib: TInfoBlock;
  fs: TFileStream;
const
  Textur32: packed array[0..1, 0..1, 0..3] of byte = ((($FF, $00, $00, $FF), ($00, $FF, $00, $FF)), (($00, $00, $FF, $FF), ($FF, $00, $00, $FF)));
begin
  with dk do begin
    bfType := byte('B') + byte('M') shl 8;
    bfSize := SizeOf(TDateiKopf) + SizeOf(TInfoBlock) + SizeOf(Textur32);
    bfReserved := 0;
    bfOffBits := 54;
  end;
 
  with ib do begin
    biSize := 40;
    biWidth := 2;
    biHeight := 2;
    biPlanes := 1;
    biBitCount := 32;
    biCompression := 0;
    biSize := 40;
//    biSize := 0;
//   biSize := SizeOf(Textur32);
    biXPelsPerMeter := 0;
    biYPelsPerMeter := 0;
    biClrUsed := 0;
    biClrImportant := 0;
  end;
  fs := TFileStream.Create('test.bmp', fmCreate);
 
 
  fs.Write(dk, SizeOf(dk));
  fs.Write(ib, SizeOf(ib));
  fs.Write(Textur32, SizeOf(Textur32));
 
  fs.Free;
end;  \0
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: BMP-Header

Beitrag von wp_xyz »

Verstehe ich nicht. Wo steht, dass biSize 0 sein kann? Ich sehe in dem wikipedia-Artikel nur: "biSize - Größe der BITMAPINFOHEADER Struktur in Bytes", und wenn ich mir die Offset links ansehe, beginnt er bei Offset 14 und endet mit dem Byte bei Offset 53, umfasst also 40 Bytes. Das ist bei vielen binären Dateiformaten so, dass zu Beginn jedes Records eine Größenangabe steht, so dass man von Record zu Record hüpfen kann, ohne die Records komplett zerlegen zu müssen.
Dateianhänge
bmpinfoheader.png

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: BMP-Header

Beitrag von theo »

Die Records sind übrigens als TBitMapFileHeader und TBitMapInfoHeader auch in Unit BMPcomn deklariert. Braucht mal also nicht nochmal machen.

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BMP-Header

Beitrag von Mathias »

Verstehe ich nicht. Wo steht, dass biSize 0 sein kann? Ich sehe in dem wikipedia-Artikel nur: "biSize - Größe der BITMAPINFOHEADER Struktur in Bytes",

Danke für den Anhang, jetzt ist mir der 20iger runter gerutscht.
Jetzt sehe ich den Fehler gesehen, das bsSize, hätte bsSizeImage heissen sollen.

War wohl gestern zu Müde. :oops:

Die Records sind übrigens als TBitMapFileHeader und TBitMapInfoHeader auch in Unit BMPcomn deklariert.

Danke.

In dieser Unit habe ich noch zwei Swap-Funktionen entdeckt, welchen Zweck erfüllen diese ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: BMP-Header

Beitrag von wp_xyz »

Mathias hat geschrieben:In dieser Unit habe ich noch zwei Swap-Funktionen entdeckt, welchen Zweck erfüllen diese ?

Wenn ich jetzt wüsste, wo ich meine Kristallkugel wieder hingelegt habe...

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BMP-Header

Beitrag von Mathias »

Wenn ich jetzt wüsste, wo ich meine Kristallkugel wieder hingelegt habe...

Bezieht sich auf die Unit BMPcomn welche Theo erwähnt hat.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: BMP-Header

Beitrag von theo »

Naja, schwappt halt. :mrgreen:

Ist vllt. für andere Prozessoren, keine Ahnung.
https://de.wikipedia.org/wiki/Byte-Reihenfolge

Brauchst du ziemlich sicher nicht.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: BMP-Header

Beitrag von wp_xyz »

Auf der wikipedia-Seite, die du selbst schon zitiert hast, steht: "BMP verwendet die Little-Endian-Konvention." Das heißt, dass eine Big-Endian-Maschine, die eine bmp-Datei lesen/schreiben will, die Byte-Reihenfolge umdrehen muss, um die Zahlen richti zu interpretieren.

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BMP-Header

Beitrag von Mathias »

wp_xyz hat geschrieben:Auf der wikipedia-Seite, die du selbst schon zitiert hast, steht: "BMP verwendet die Little-Endian-Konvention." Das heißt, dass eine Big-Endian-Maschine, die eine bmp-Datei lesen/schreiben will, die Byte-Reihenfolge umdrehen muss, um die Zahlen richti zu interpretieren.

Dies wäre bei Java der Fall.

Vor gar nicht so langer Zeit, hatte ich mit fast die Zähne wegen Little und Big-Endian ausgebissen. Ich wollte Daten auf Java portieren.
Das grösste Problem war, ich wusste nicht mal, das es da zwei Datenarten gab. :oops:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten