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)+256sizeof(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;
}