Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
idontknow
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <Windows.h> #include <string> #include <fstream> void createBitmap(const std::string& filename, unsigned int width, unsigned int height, DWORD* pixeldata) { std::fstream fileStream(filename, std::ios::binary | std::ios::out); BITMAPFILEHEADER fileHeader = {0x4D42, 56 + width * height * 3, 0, 0, 56}; BITMAPINFOHEADER fileInfoHeader = {40, width, height * (-1), 1, 24, BI_RGB, 0, 0, 0, 0, 0}; /* BitmapFileHeader */ fileStream.write(reinterpret_cast<char*>(&fileHeader.bfType), sizeof(WORD)); fileStream.write(reinterpret_cast<char*>(&fileHeader.bfSize), sizeof(DWORD)); fileStream.write(reinterpret_cast<char*>(&fileHeader.bfReserved1), sizeof(WORD)); fileStream.write(reinterpret_cast<char*>(&fileHeader.bfReserved2), sizeof(WORD)); fileStream.write(reinterpret_cast<char*>(&fileHeader.bfOffBits), sizeof(DWORD)); /* BitmapInfoHeader */ fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biSize), sizeof(DWORD)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biWidth), sizeof(LONG)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biHeight), sizeof(LONG)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biPlanes), sizeof(WORD)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biBitCount), sizeof(WORD)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biCompression), sizeof(DWORD)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biSizeImage), sizeof(DWORD)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biXPelsPerMeter), sizeof(LONG)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biYPelsPerMeter), sizeof(LONG)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biClrUsed), sizeof(DWORD)); fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biClrImportant), sizeof(DWORD)); DWORD *pdataptr = pixeldata; for(unsigned int y = 0; y < height; ++y) { pdataptr = pixeldata + width * y; unsigned int x = 0; for(; x < width; ++x) { pdataptr += x; DWORD pixel = *pdataptr; char bgr[3] = {(pixel & 0x000000ff) >> 0, (pixel & 0x0000ff00) >> 8, (pixel & 0x00ff0000) >> 16}; fileStream.write(reinterpret_cast<char*>(&bgr), sizeof(char) * 3); } if((x * 3) % 4 != 0) { for(int i = 0; i < ((x * 3) % 4); ++i) { char c = 0; fileStream.write(reinterpret_cast<char*>(&c), sizeof(char)); } } } fileStream.close(); } int main() { DWORD bmp[4] = {0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000}; createBitmap("mybmp.bmp", 2, 2, &bmp[0]); return 0; } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (08.09.2010, 17:49)
idontknow
unregistriert
Warum schreibst du denn alle Elemente des Headers einzeln in die Datei ? Kannst doch einfach den ganzen Header auf einmal reinschreiben
Die Bilddaten starten am Offset 54, du hast dich da um 2 Byte vertan und bei der Dateigröße vergisst du die Paddingbytes.
o Die Bilddaten starten am Offset 54, du hast dich da um 2 Byte vertan
o Bei der Dateigröße vergisst du die Paddingbytes
o Du gibst keinen Wert für die Datasize an
o Du gibst keine sinnvollen Werte für die X- und Y-Resolution an
o Du berechnest die Anzahl der Paddingbytes falsch
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; file.write((char*)&fileHeader, sizeof(fileHeader)); file.write((char*)&infoHeader, sizeof(infoHeader)); |
hmm. Dachte die beiden Header hätten zusammen 56 Byte. Na gut dummer Fehler, danke
3: die Dateigröße im ersten header ist laut Wikipedia egal und im Infoheader kann man aufgrund von der BI_RGB Kompression 0 angeben.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »David_pb« (08.09.2010, 18:32)
idontknow
unregistriert
Warum soll die Berechnung der Padding Bytes falsch sein? :o
edit: berechnung sollte stimmen, immerhin gehts wenn ich geändert habe was du angemerkt hast . Danke!
idontknow
unregistriert
Nein. Bild ist 2x2 Pixel macht 6 Bytes pro Zeile, muss also mit 2Bytes aufgefüllt werden.
Quellcode |
|
1 2 3 4 5 6 |
(3 * 1) % 4 = 3 <- falsch, richtig: 1 weil 3 + 1 = 4 (% 4) == 0 (3 * 2) % 4 = 2 <- stimmt (3 * 3) % 4 = 1 <- falsch, richtig: 3 weil 9 + 3 = 12 (% 4) == 0 (3 * 4) % 4 = 0 <- stimmt // usw... |
Werbeanzeige