bitmap erzeugen
-
so schwer kann es ja eigentlich nicht sein, da eine bitmap ja aus einzelnen punkten besteht....
was ich erreichen will, ist, dass eine bitmap erstellt wird. über mein c programm übergebe ich dabei in einer schleife dir farbe des jeweiligen bildpunktes. ich verwende dabei bloss drei farben.. gibt es dafür eine lösung???
also in der schleife den bitmap-file ansprechen, und dann sagen punkt(x,y) hat die und die farbe?!thx, KB
-
Also ich bin an einem ähnlichen Problem. Um eine Bitmap zu speichern, musst du zuerst die Header der Bitmap speichern:
/* //////////////Die Stuct's für das Öffnen einer BMP///////// typedef struct tagBITMAPFILEHEADER { WORD bfType; //Muss BM sein; DWORD bfSize; //Grösse der Bitmap Datei WORD bfReserved1; //Muss 0 sein; WORD bfReserved2; // " DWORD bfOffBits; //Anfang der Bilddaten }BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { DWORD biSize; //Grösse dieser Struktur LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; //BPP's DWORD biCompression; DWORD biSizeImage; //Grösse der Bilddaten LONG biXPelsPerMeter; //Auflösung LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImoprtant; }BITMAPINFOHEADER; //Für die Palette typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; //=0 }RGBQUAD; */
Ich habe das so gemacht:
LPBYTE Bilddaten; HANDLE hDatei; BITMAPINFOHEADER bmInfo; BITMAPFILEHEADER bmFile; RGBQUAD Palette[256]; DWORD Zwischenspeicher; ////////////ZUERST DER FILEHEADER////////////// bmFile.bfType=19778; //Entspricht 'BM' bmFile.bfSize=sizeof(Breite*Hoehe)+sizeof(RGBQUAD[256])+sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); bmFile.bfReserved1=0; bmFile.bfReserved2=0; bmFile.bfOffBits=sizeof(RGBQUAD[256])+sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); if (!WriteFile(hDatei, &bmFile, sizeof(bmFile), &Zwischenspeicher, NULL)) { CloseHandle(hDatei); return DDRAW_ERROR; } ////////////DANN DER INFOHEADER//////////////// bmInfo.biSize=sizeof(BITMAPINFOHEADER); bmInfo.biWidth=Breite; bmInfo.biHeight=Hoehe; bmInfo.biPlanes=1; bmInfo.biBitCount=8; //bpp bmInfo.biCompression=BI_RGB; //Keine Kompression bmInfo.biSizeImage=sizeof(Breite*Hoehe);//Man kann hier auch 0 angeben, da nicht Komprimiert bmInfo.biXPelsPerMeter=0; //Die X-Auflösung bmInfo.biYPelsPerMeter=0; //Die Y- " bmInfo.biClrUsed=0; //Alle Farben bmInfo.biClrImportant=0; // " " if (!WriteFile(hDatei, &bmInfo, sizeof(bmInfo), &Zwischenspeicher, NULL)) { CloseHandle(hDatei); return DDRAW_ERROR; }
Ich kann dir nicht sagen ob die Header so 100% richtig sind. Tut mir leid, dass es nicht so ausführlich kommentiert ist.
Danach ist es je nach Farbtiefe unterschiedlich. Ich denke, 8bpp sind am einfachsten, aber du kannst mit 3 Farben natürlich auch 4bpp nehmen. Bei 4bpp werden jeweils 2 Punkte in einem Byte gespeichert, bei 8bpp einer.
Bei 8bpp wird nun die FarbPalette vom Typ RGBQUAD gespeichert.
Danach kommen die Bilddaten. Dort werden dann einfach die zum Punkt gehörigen Farbwerte gespeichert wie du schon gesagt hast, bzw Es wird jder Index der Farbpalette gespeichert.
Vielleicht noch der Hinweis, dass die BMP-Grafiken oft auf "dem Kopf" gespeichert werden. Ich bin mir nicht sicher, aber ich glaube, dass man durch die angabe von -Hoehe anstelle von Hoehe im Header angeben kann, das sie nicht "auf dem Kopf" gespeichert wurde.
Vielleicht hilft dir das wenigstens ein bisschen.
Such doch mal auf www.wotsit.org nach dem bmp format, das hilft. Irgendwo habe ich noch mehr Links dazu, ich such sie dir dann mal raus.