2017-10-31 3 views
1

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?

Antwort

0

OutputPixelSize ist ein uint32_t. Und sizeof(OutputPixelSize) wird daher 4. So

fwrite(&OutputPixels, sizeof(OutputPixelSize), 1, OutFile); 

nur 4 Bytes in die Datei schreibt.

Zusätzlich &OutputPixels ist die Adresse des Zeigers auf die Daten, nicht der Zeiger auf die Daten. Sie sollten stattdessen OutputPixels an fwrite übergeben. Versuchen Sie:

fwrite(OutputPixels, 1, OutputPixelSize, OutFile); 
+0

Oh vielen Dank, verpasste ich irgendwie jedes Mal, wenn ich meinen Code lese :) – xsnk

Verwandte Themen