gdi+: DIB daten -> HDC



  • hallo,

    schon seit einiger zeit versuche ich, einen gegebenen block von DIB daten irgendwie in ein HDC zu bekommen, um damit weiter zu machen.

    Wenn es schon nicht direkt geht (?) müsste ich ja irgendwie einen Bitmpa header vor den DIB header legen...oder? Aber wie?

    Außerdem sieht es mir nicht so aus als würden meine DIB daten ein eigenen Header haben...oder wird der nur benötigt wenn man mit bestimmten farbpaletten arbeitet?

    danke,

    f 🙂



  • Hilft dir das?



  • ja, das hört sich doch schon gut an 🙂
    imo ist die msdn kurz beschreibung da ein bischen irreführend...

    soweit also meine code...zu versuchszwecken wird hier einfach nur ein screenshot erstellt, von dem die DIB bits genommen und wider (leicht versetz) auf den Bildschirm geschrieben, mit BitBlt():

    int cxScreen=GetSystemMetrics(SM_CXSCREEN);
    	int cyScreen=GetSystemMetrics(SM_CYSCREEN);
    
    	BITMAPINFO pBitmapInfo;
    	SecureZeroMemory(&pBitmapInfo,sizeof(BITMAPINFO));
    	pBitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFO);
    	pBitmapInfo.bmiHeader.biWidth = cxScreen;
    	pBitmapInfo.bmiHeader.biHeight = cyScreen;
    	pBitmapInfo.bmiHeader.biPlanes = 1;
    	pBitmapInfo.bmiHeader.biBitCount = 32;
    	pBitmapInfo.bmiHeader.biCompression = BI_RGB;
    
    	bool test;
    
    	HDC scrn = CreateDC("DISPLAY",NULL,NULL,NULL);
    	//HDC neww = CreateCompatibleDC(scrn);
    	PAINTSTRUCT Ps;
    	HDC frm = BeginPaint(mainhwnd, &Ps);
    	HDC neww = CreateCompatibleDC(frm);
    	HDC n2 = CreateCompatibleDC(frm);
    
    	PatBlt(neww,0,0,cxScreen,cyScreen,BLACKNESS);
    
    	//take a screenshot in neww
    	BitBlt(neww,0,0,cxScreen,cyScreen,scrn,0,0,SRCCOPY);
    
    	void* bts;//get the DIB bits from that screenshot
    	HBITMAP hbm = CreateDIBSection(neww,&pBitmapInfo,DIB_RGB_COLORS,(void**)&bts,0,0);
    
    	//´"convert" DIB bits to HDC n2
    	test = StretchDIBits(n2,0,0,cxScreen,cyScreen,0,0,cxScreen,cyScreen,bts,&pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    
    	//draw n2 to the dialog
    	test = BitBlt(frm,10,0,cxScreen,cyScreen,neww,0,0,SRCCOPY);
    
    	EndPaint(mainhwnd,&Ps);
    

    soweit die theorie....leider funktionirts nicht so wirklich, obwohl alle funktionen "true" zurückgeben.

    irgendwelche ideen? 😉



  • sollte es nicht einfacher mit den funktionen

    GetDIBits
    SetDIBits

    gehen?

    Ich muässte allerdings eine temporäre Bitmap erstellen...ist das zu empfehlen?



  • du kannst dir ein Bitmap-Objekt, direkt aus den pixel-Daten erstellen: Bitmap::Bitmap(BITMAPINFO*,VOID*)
    Über Graphics.DrawImage() bringst du das Ding dann in den DC (ich gehe mal davon aus, dass du das Graphics-Obj. von einem DC ausgehend erstellst)



  • yup, das geht auch.
    ich glaube aber das es noch effektiver ist, wenn man die DIB bit direkt memcpy() auf einen pointer kpopiert, den man von der StretchDIbbits funktion bekommt...

    gelöst, danke an alle 🙂


Anmelden zum Antworten