Ich fing an, Casey Muratoris ausgezeichnetem handgemachtem Held Stream zu folgen, und wurde vor kurzem inspiriert, einen BMP Bildlader von Grund auf zu schreiben.Schwierigkeit, in eine Bitmap-Datei zu schreiben
habe ich eine einzige Struktur
#pragma pack(push, 1)
struct bitmap_header {
uint16_t FType;
uint32_t FSize;
uint16_t Reserved_1;
uint16_t Reserved_2;
uint32_t BitmapOffset;
uint32_t Size;
int32_t Width;
int32_t Height;
uint16_t Planes;
uint16_t BitsPerPixel;
uint32_t Compression;
uint32_t SizeOfBMP;
int32_t HorzResolution;
int32_t VertResolution;
uint32_t ColorsUsed;
uint32_t ColorsImportant;
};
#pragma pack(pop)
die Werte eines Bitmap-Header zu füllen und dann gefüllt I
bitmap_header Header = {};
Header.FType = 0x4D42; // Magic Value Here
Header.FSize = sizeof(Header) + OutputPixelSize; // entire file size
Header.BitmapOffset = sizeof(Header);
Header.Size = sizeof(Header) - 14; // Size of the Header exluding the above
Header.Width = OutputWidth;
Header.Height = -(int32_t)OutputHeight;
Header.Planes = 1;
Header.BitsPerPixel = 24;
Header.Compression= 0;
Header.SizeOfBMP = OutputPixelSize;
Header.HorzResolution = 0;
Header.VertResolution = 0;
Header.ColorsUsed = 0;
Header.ColorsImportant = 0;
I die Werte am Eingangspunkt, um einen 32-Bit Integer ohne Vorzeichen Zeiger erstellt um die Pixeldaten zu speichern und dann die Pixeldaten mit einer Farbe zu schreiben.
uint32_t OutputPixelSize = sizeof(uint32_t) * OutputWidth * OutputHeight;
uint32_t *OutputPixels = (uint32_t *)malloc(OutputPixelSize);
uint32_t *Out = OutputPixels;
for (uint32_t Y = 0; Y < OutputHeight; ++Y) {
for (uint32_t X = 0; X < OutputWidth; ++X) {
*Out++ = 0xFF0000FF;
}
}
Schließlich habe ich die Daten in eine BMP-Datei unter Verwendung von Standard fwrite() Funktion
FILE* OutFile = fopen("test.bmp", "wb");
if (OutFile) {
fwrite(&Header, sizeof(Header), 1, OutFile);
fwrite(&OutputPixels, sizeof(OutputPixelSize), 1, OutFile);
fclose(OutFile);
}
Das Programm läuft, und eine Datei erstellt wird; Aber die oben erwähnte Datei wird von keinem Programm erkannt. Ich habe den Header mit einer gültigen BMP-Datei verglichen und sie sind bis auf die Dateigröße ähnlich. Ich weiß nicht, ob ich die Daten richtig in die Datei schreibe oder nicht?
Oh vielen Dank, verpasste ich irgendwie jedes Mal, wenn ich meinen Code lese :) – xsnk