BMP-Header

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.

BMP-Header

Beitragvon Mathias » 13. Jun 2017, 22:14 BMP-Header

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 14. Jun 2017, 06:13 Re: BMP-Header

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2280
Registriert: 8. Apr 2011, 08:01

Beitragvon theo » 14. Jun 2017, 09:09 Re: BMP-Header

Die Records sind übrigens als TBitMapFileHeader und TBitMapInfoHeader auch in Unit BMPcomn deklariert. Braucht mal also nicht nochmal machen.
theo
 
Beiträge: 7895
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 14. Jun 2017, 17:08 Re: BMP-Header

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 14. Jun 2017, 17:25 Re: BMP-Header

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...
wp_xyz
 
Beiträge: 2280
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 14. Jun 2017, 18:43 Re: BMP-Header

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 14. Jun 2017, 19:48 Re: BMP-Header

Naja, schwappt halt. :mrgreen:

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

Brauchst du ziemlich sicher nicht.
theo
 
Beiträge: 7895
Registriert: 11. Sep 2006, 18:01

Beitragvon wp_xyz » 14. Jun 2017, 21:10 Re: BMP-Header

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.
wp_xyz
 
Beiträge: 2280
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 15. Jun 2017, 17:06 Re: BMP-Header

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried