Bitmap Strukturaufbau aus einem anderen format !



  • Hallo zusammen,

    ich habe ein Problem mit meinem Bitmap kann mir da jemand vielleicht weiterhelfen ?

    wenn ich das jetzt Richtig verstanden habe Bau ich mir als erstes den Header einer Bitmap Struktur , anschließend bestimme ich jeden einzelnen punkt des Bildes von oben links nach unten rechts.Anschließend übergebe ich das an meine

    hTerrainBitmap variablen mit der Methode CreateDIBitmap da ich es nicht auf dem Bildschirm Zeichne.

    Meine Variablen habe ich schon überprüft die sind gefüllt.

    Meine Fehlermeldung ist ACCESS VIOLATION an der ersten lpbmi stelle der readMap Methode

    Header meiner Klasse :

    class CDTEDFile : public CObject  
    {
    public:
    	HBITMAP MakeBitmap(int minAlt,int maxAlt);
    	// Variable
    	int nCols;
    	int nRows ;
    	long double xllCorner;     
    	long double yllCorner;     
    	long double cellSize ;     
    	int NoData_Value;
    	// seine Variablen
    	// globals für terrain data
    	HBITMAP hTerrainBitmap;
    	HBITMAP hTerrainInverseBitmap;
    	HBITMAP hTerrainContrastIncreasedBitmap;
    
    	CHAR	*lpBits;      /* Pointer to Work Area */ 
    	BITMAPINFO *lpbmi;
    	int		terrainMin;
    	int		terrainMax;
    
    	// Vector
    	std::vector<int> DataVec;
    	std::vector<int>::const_iterator DataVecPos;
    	//Methode
    	bool readMap(CString);
    
    	// Seraialisierung
    	DECLARE_SERIAL( CDTEDFile )
    	// Konstrucktor/Destrucktor
    	CDTEDFile();
    	virtual ~CDTEDFile();
    	void Serialize( CArchive& archive );
    
    private :
    	// Interne Methode		
    	bool searchNoData(CString);
    
    };
    

    relevante Methoden meiner CPP :

    bool CDTEDFile::readMap(CString Dateiname)
    {
    ......... Datei öffnen auslesen und int und double variable initialisieren 
    
    // build the BITMAPINFO structure / einmal reicht 
    lpbmi->bmiHeader.biSize = 40;
    lpbmi->bmiHeader.biWidth = nCols -nCols%4; // muss vielfaches von 4 sein!
    lpbmi->bmiHeader.biHeight = nRows; 
    lpbmi->bmiHeader.biPlanes = 1; 
    lpbmi->bmiHeader.biBitCount = 24; 
    lpbmi->bmiHeader.biCompression = 0; 
    lpbmi->bmiHeader.biSizeImage =nRows*(nCols -nCols%4)*3; 
    lpbmi->bmiHeader.biXPelsPerMeter = 0; 
    lpbmi->bmiHeader.biYPelsPerMeter =0; 
    lpbmi->bmiHeader.biClrUsed =0; 
    lpbmi->bmiHeader.biClrImportant =0; 
    // build the Bitmap
    hTerrainBitmap = MakeBitmap (terrainMin, terrainMax); // Funktionsaufruf
    
    }
    
    HBITMAP CDTEDFile::MakeBitmap(int minAlt, int maxAlt)
    {
     HBITMAP hbitmap ;
     int x,y,z=0;
     std::vector<int>::const_iterator DataVecPos=DataVec.begin();
     for (y= nRows -1;y>=0;y--)  // Start bei nRows-1
      {
       for (x=0;x<nCols -nCols%4;x++)
    	 {
    	  float c,r,g,b;
    	  if (*DataVecPos ==NoData_Value) { r=0;g=0;b= 0xff;} // NODATA-->blau
    			   else
    		 {   // skalieren
    		  c=(float)((float)(*DataVecPos-minAlt)/(maxAlt - minAlt)); 
    		  if (4*c <=1) // d.h. c <= 0.25
    		 { // weiss -> oliv
    		 b= 0xff- (0xff-0x00) * (4 * c - 0);		// ff -> 00
    		 g= 0xff- (0xff-0x80) * (4 * c - 0);		// ff -> 80
    		 r= 0xff- (0xff-0x80) * (4 * c - 0);		// ff -> 80
    		 }
    		 else if (4*c <=2)// d.h. c <= 0.5
    		 { // oliv -> orange
    		 b= 0x00- (0x00-0x00) * (4 * c - 1);		// 00 -> 00
    		 g= 0x80- (0x80-0xa5) * (4 * c - 1);		// 80 -> a5
    		 r= 0x80- (0x80-0xff) * (4 * c - 1);		// 80 -> ff
    		 }
    		 else if (4*c <=3)// d.h. c <= 0.75
    		 { // orange -> braun
    		 b= 0x00- (0x00-0x2a) * (4 * c - 2);		// 00 -> 2a
    		 g= 0xa5- (0xa5-0x2a) * (4 * c - 2);		// a5 -> 2a
    		 r= 0xff- (0xff-0x45) * (4 * c - 2);		// ff -> a5
    		 }
    		 else								 // braun -> schwarz
    		 {
    		 b= 0x2a- (0x2a-0x00) * (4 * c - 3);		// 2a -> ff
    		 g= 0x2a- (0x2a-0x00) * (4 * c - 3);		// 2a -> ff
    		 r= 0xa5- (0xa5-0x00) * (4 * c - 3);		// a5 -> ff
    		 };
    		 }
    		 if (r>255) r=255; if (r<0) r=0;
    		 if (g>255) g=255; if (g<0) g=0;
    		 if (b>255) b=255; if (b<0) b=0;
    		 lpBits[z]= (UCHAR)(b) ; z++; // blau
    		 lpBits[z]= (UCHAR)(g) ; z++; // grün
    		 lpBits[z]= (UCHAR)(r) ; z++; // rot
    		 }; // for x
    	   }; // for y
    	   // bitmap neu
    
                CDC pDC;
    	   hbitmap = CreateCompatibleBitmap( pDC, nCols -nCols%4, nRows);
    	   SetDIBits(
    	   pDC,				// handle to device context
    	   hbitmap,			// handle to  bitmap
                0,				// starting scan line
    	   nRows,				// number of scan lines
    	   (CHAR  *)lpBits ,		// array of bitmap bits
    	   lpbmi,			// address of structure with bitmap data
                DIB_RGB_COLORS		// type of color indexes to use
    	   );
    
    	   return hbitmap;
    }
    


  • Hallo noch mal zusammen,

    hat den keiner eine Ahnung , und kann mir weiterhelfen ?

    mfg
    cc



  • Hallo zusammen,

    also stell ich Frage noch einmal anders.

    Ich möchte per Code ein Bitmap zeichnen.

    was ist in meinem Code Falsch siehe oben erster Beitrag oder habe ich den Falschen ansatz ?

    danke im voraus.

    mfg
    cc



  • Ich glaube du hast hier einiges völlig falsch verstanden. Such am besten einmal mit der Suchfunktion nach CBitmap, dann solltest du eine Menge nützlicher Beiträeg finden.

    Grundlegende ´Reihenfolge um ein Bitmap zu laden:

    1.) laden -> LoadImage(....) oder LoadBitmap(....)
    2.) geladenes Bitmap in Memory Devicekontext selektieren
    3.) diesen dann auf den DC des anzeigefensters blitten (StretchBlt(...) oder
    BitBlt(....) )



  • Hi ich will aus dieser Funktion das Bitmap anzegen lassen in meinem Dialog. Hat da jemand eine idee? Hab es versucht über HBITMAP aber klappt irgendwie nicht. zeigt keinen Fehler klappt aber auch nicht???

    Freu mich über Antwort

    HGLOBAL GetPCVisionImageSnap()
    {
    BYTE *m_lpstr;

    int iLoop;
    long len;
    RGBQUAD lpRgb;
    LPBITMAPINFOHEADER lpInf;
    len = m_ImageMaxX * m_ImageMaxY;
    HGLOBAL hBmp = GlobalAlloc (GMEM_FIXED,(LONG)sizeof(BITMAPINFOHEADER)+256
    sizeof(RGBQUAD)+len);
    lpInf = (LPBITMAPINFOHEADER)GlobalLock(hBmp);
    lpInf->biSize=sizeof(BITMAPINFOHEADER);
    lpInf->biWidth=m_ImageMaxX;
    lpInf->biHeight=m_ImageMaxY;
    lpInf->biPlanes=1;
    lpInf->biBitCount=8;
    lpInf->biCompression=BI_RGB;
    lpInf->biSizeImage=m_ImageMaxX*m_ImageMaxY;
    lpInf->biXPelsPerMeter=0;
    lpInf->biYPelsPerMeter=0;
    lpInf->biClrUsed=256;
    lpInf->biClrImportant=0;
    m_lpstr= (BYTE *)lpInf+sizeof(BITMAPINFOHEADER);
    lpRgb=(RGBQUAD *)m_lpstr;
    for (iLoop = 0; iLoop < 256; iLoop++)
    {
    lpRgb->rgbBlue=(BYTE)iLoop;
    lpRgb->rgbGreen=(BYTE)iLoop;
    lpRgb->rgbRed =(BYTE)iLoop;
    lpRgb->rgbReserved =(BYTE)0;
    lpRgb++;
    }
    m_lpstr=m_lpstr+256 * sizeof(RGBQUAD) ;
    itx_host_snap(m_fghIcp0,m_lpstr);

    HGLOBAL hBmpTmp=mirror_yBMP(hBmp);
    GlobalFree(hBmp);
    // GlobalUnlock(hBmpTmp);
    return hBmpTmp;
    }


Anmelden zum Antworten