Bitmap von 2d-Array erstellen



  • Hallo,

    ich habe ein zweidimensionales char Array wo entweder die Werte 0, 1, 2 oder 3 abgespeichert sind. Jetzt würde ich gerne zu jedem dieser Werte einen Farbe zuordnen (z.B. 0 = weis, 1 = hellblau , 2 = blau, 3 = dunkelblau). Anschließend würde ich gerne daraus ein Bitmap erstellen und speichern. Ich habe bis jetzt versucht den BITMAPINFOHEADER und BITMAPFILEHEADER zuschreiben (Habe die Vorlage von 0_saya_0):

    #include<Windows.h>
    #include<iostream>
    #include<string>
    #include<cmath>
    #include<fstream>
    #include<stdlib.h>
    
    void bitmap(int iDim_Raster, char** AnzahlUeberschneidungen)
    {
    	int iZ;
    	int iS;
    	char a_n;
    
    	ofstream bmpdata("MooreRukovena.bmp", ios::out|ios::binary);	//begin stream
    
    	/*Bitmapfileheader*/
    	BITMAPINFOHEADER bmpinfo;
        bmpinfo.biSize = sizeof(BITMAPINFOHEADER); 
        bmpinfo.biWidth =  iDim_Raster; 
        bmpinfo.biHeight =  iDim_Raster; 
        bmpinfo.biPlanes = 1;
        bmpinfo.biBitCount = 2;                                                           
        bmpinfo.biCompression = BI_RGB; 
        bmpinfo.biSizeImage = 0; 
        bmpinfo.biXPelsPerMeter = 0; 
        bmpinfo.biYPelsPerMeter = 0; 
        bmpinfo.biClrUsed = 0;
    	bmpinfo.biClrImportant = 0;    
    
    	/*Bitmapinfoheader*/
    	BITMAPFILEHEADER bmpfile;
        bmpfile.bfType = 'MB';
        bmpfile.bfSize = (bmpinfo.biWidth * bmpinfo.biHeight * (bmpinfo.biBitCount / 8)) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        bmpfile.bfReserved1 = 0; 
        bmpfile.bfReserved2 = 0; 
        bmpfile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
    	bmpdata.write((char*)&bmpfile, sizeof(bmpfile));
        bmpdata.write((char*)&bmpinfo, sizeof(bmpinfo));
    
    	/*Beschreibt eine Farbe nach der relativen Intensität von blau, rot und grün*/
    
    	for(iZ = 0; iZ < bmpinfo.biHeight; iZ++)
    	{
    		for(iS = 0; iS < bmpinfo.biWidth; iS++)
    		{
    			a_n = AnzahlUeberschneidungen[iZ][iS];
    
    			if(a_n == 0)
    			{
    				RGBQUAD bmp;
    				bmp.rgbBlue = 255; 
    				bmp.rgbGreen = 255; 
    				bmp.rgbRed = 255;
    
    				bmpdata.write((char*)&bmp, 3);
    				continue;
    			}
    
    			if(a_n == 1)
    			{
    				RGBQUAD bmp;
    				bmp.rgbBlue = 255; 
    				bmp.rgbGreen = 226; 
    				bmp.rgbRed = 176;
    
    				bmpdata.write((char*)&bmp, 3);
    				continue;
    			}
    		}
    	}
    	bmpdata.close();    //stream end, bmp created
    }
    

    Ich weis nicht wie ich das Feld nacheinander durchgehe und ihm Farben zuweise. Ich habe zudem keine Ahnung wie ich die Pixel-Daten dann an die BMP-Datei übergebe.
    Auch verstehe ich den Befehl in der Schleife nicht (

    bmpdata.write((char*)&bmp, 3);
    

    )

    Wie könnte ich das Array Zeile für Zeile und Spalte für Spalte durchgehen und je nach Wert eine Farbe vorgeben und anschließend dieses Pixel (jeder Wert soll auch ein Pixel sein) zeichnen? 😕

    Komisch ist auch, wenn ich die Bitmap wird sehr groß (500 MB), selbst wenn biWidth und biheight nur 5 sind!??

    Vielen Dank im Voraus!
    Beste Grüße



  • Habe es soweit selber gelöst.
    Jetzt würde ich aber gerne statt biBitCount = 24, 4 nehmen, da ich nur 5 Farben brauche. Mit Hilfe von Google habe ich erfahren, dass man dafür eine Farbtabelle anlegen muss.

    Kann mir jemanden erklären wie das funktioniert.

    Gruß



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply