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.


Log in to reply