Um @ TheBluefish Antwort zu klären, dieser Code hat den Fehler
// Read number of bytes used per pixel
int liczbaBitow;
plik.read((char*)&liczbaBitow, 2);
Wenn Sie (char*)&libczbaBitow
verwenden, werden Sie die Adresse einer 4-Byte-Integer übernimmt und sagen Sie den Code 2 Byte dort zu setzen.
Die anderen zwei Byte dieser Ganzzahl sind nicht angegeben und nicht initialisiert. In diesem Fall sind sie 0xCC
, da dies der Stack-Initialisierungswert ist, der vom System verwendet wird.
Aber wenn Sie dies von einer anderen Funktion oder wiederholt aufrufen, können Sie erwarten, dass der Stapel andere gefälschte Werte enthält.
Wenn Sie die Variable initialisieren, erhalten Sie den erwarteten Wert.
Aber es gibt einen anderen Fehler .. Byte-Reihenfolge ist auch hier wichtig. Dieser Code geht davon aus, dass die native Byte-Reihenfolge der Maschine genau der Byte-Reihenfolge aus der Dateispezifikation entspricht. Es gibt eine Reihe von verschiedenen Bitmap-Formate, sondern von Ihrer Referenz, die Wikipedia-Artikel sagt:
alle ganzzahligen Werte gespeichert sind, in Little-Endian-Format (das heißt am wenigsten signifikante Byte zuerst).
Das ist das gleiche wie deins, das ist offensichtlich auch x86 Little Endian. Andere Felder sind nicht als Little Endian definiert. Wenn Sie also das Bild dekodieren, müssen Sie darauf achten.
Idealerweise würden Sie in ein Bytearray einlesen und die Bytes dort platzieren, wo sie hingehören. Siehe Convert Little Endian to Big Endian
int libczbaBitow;
unsigned char bpp[2];
plik.read(bpp, 2);
libczbaBitow = bpp[0] | (bpp[1]<<8);
Sie müssen zeigen, wie die Datei geöffnet wurde.Wurde es mit dem Flag 'ios :: binary' geöffnet? – PaulMcKenzie
Sie setzen zwei Bytes in eine unititialisierte (möglicherweise 4 Byte lange) Ganzzahl. Versuchen Sie, 'liczbaBitow' als ersten Schritt auf Null zu initialisieren. – Machtl
Das [Bitmap-Dateiformat] (https://msdn.microsoft.com/en-us/library/dd183391.aspx) ist ** übrigens ** zu komplex, um einen eigenen Parser zu schreiben. Verwenden Sie eine Bibliothek, die entweder in Ihre Plattform integriert ist, oder eine Bibliothek eines Drittanbieters. – IInspectable