Grafik daten ermitteln

CodeFatal

Erfahrenes Mitglied
Hallo,
ich suche eine einfache Möglichkeit aus einem CDC Objekt die Grafikdaten auszulesen.

Ich habe in etwa folgendes
Code:
void lese(CDC *dc,...)
{
CBitmap bgr;
CBitmap *oldbgr;

CDC dcbgr;

dcbgr.CreateCompatibleDC(dc);

dcbgr.BitBlt(...,dc,...);

bgr.CreateBitmap(...);
oldbgr = dcbgr->SelektObjekt(&bgr);

/*
Wie bekomme ich an dieser Stelle Zugriff auf die Grafikdaten innerhalb von dcbgr?
*/


dcbgr->SelectObjekt(oldbgr);
bgr.DeleteObjekt();
dcbgr.DeleteDC()

}
Am liebsten wäre es mir wenn ich die Daten in einem BITMAP Struct erzeugen könnte.


Danke Michael
 
Siehe untenstehenden Code. Nach BitBlt() stehen die Grafikdaten zur Verfügung. Die Variable "rect" enthält Position und Größe des Bildschirmbereiches, dessen Grafikdaten geholt werden sollen.
DeleteObject() bzw. DeleteDC() sind nicht erforderlich, das wird sowieso im Destruktor der jeweiligen Klassen ausgeführt.

Code:
void lese(CDC *pDC, CRect& rect,...)
{
    CDC memDC;
    CBitmap bmp;

    memDC.CreateCompatibleDC(pDC);
    bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

    CBitmap *pOldBitmap = memDC.SelectObject(&bmp);

    memDC.BitBlt( 0,
                  0,
                  rect.Width(),
                  rect.Height(),
                  pDC,
                  rect.left,
                  rect.top,
                  SCRCOPY );

    // bmp enthält jetzt die Bilddaten

    memDC.SelectObject(pOldBitmap);
}
 
Moin moin,
hab den Vorschlag gerade ausprobiert. Leider ist der Eintrag bmBits = NULL.
Da ich aber genau diesen brauch um die Daten mit einem anderen bmBits Wert zu verrechnen, hilft es leider noch nicht ganz.

Gruß Michael
 
Hast du denn GetBitmap aufgerufen? Von Haus aus wird das Member vermutlich nicht gefüllt sein.
 
Oh Sorry,

hatte ich vergessen anzugeben. Ja nutz die Funktion "int CBitmap::GetBitmap( BITMAP* pBitMap ); "

Die gibt mir ne 24 zurück und ist damit auch erfolgreich gewesen. Bis auf den Zeiger auf den Speicherbereich ist ja auch alles ok. Aber genau den brauch ich halt.

Wie krieg ich den denn raus? Raten ist wohl eher schlecht :)
Gruss Michael
 
Ah sorry, hatte ich bei der Frage überlesen.
Um aus CBitmap noch die Bits rauszuholen, brauchst du GetDIBits():

Code:
void lese(CDC *pDC, CRect& rect,...)
{
    CDC memDC;
    CBitmap bmp;

    memDC.CreateCompatibleDC(pDC);
    bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

    CBitmap *pOldBitmap = memDC.SelectObject(&bmp);

    memDC.BitBlt( 0,
                  0,
                  rect.Width(),
                  rect.Height(),
                  pDC,
                  rect.left,
                  rect.top,
                  SRCCOPY );

    // bmp enthält jetzt die Bilddaten

    BITMAP bm;
    bmp.GetBitmap(&bm);

    BITMAPINFO bmi;

    bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth        = bm.bmWidth;
    bmi.bmiHeader.biHeight       = bm.bmHeight;
    bmi.bmiHeader.biBitCount     = bm.bmBitsPixel;
    bmi.bmiHeader.biPlanes       = bm.bmPlanes;
    bmi.bmiHeader.biCompression  = BI_RGB;
    bmi.bmiHeader.biSizeImage    = bm.bmBitsPixel * bm.bmWidth * bm.bmHeight / 8;
    
    BYTE *pbyteBitmapBits = new BYTE[bmi.bmiHeader.biSizeImage];

    ::GetDIBits( memDC.GetSafeHdc(), 
                 (HBITMAP)bmp,
                 0,
                 bmi.bmiHeader.biHeight,
                 pbyteBitmapBits,
                 &bmi,
                 DIB_RGB_COLORS );

    // ....
    
    delete pbyteBitmapBits;    

    memDC.SelectObject(pOldBitmap);
}
 
Dir auch nen schönen Guten Morgen,

leider hab ich die Funktion GetDIBits() nicht zur Verfügung. Das einzige, was ungefähr in die Ecke zielt ist

WINGDIAPI UINT WINAPI GetDIBColorTable(
HDC hdc,
UINT uStartIndex,
UINT cEntries,
RGBQUAD* pColors
);

Die ist aber nur 1,4 und 8Bit Codierung zu gebrauchen.

Seh gerade ne Funktion GetObject(...).
Die scheint was für mich richtiges zu machen...
Mal schauen was da geht...

Danke auf jeden Fall für eure schnelle Hilfe.

Gruß Michael
 
Also GetObjekt(...) ist auch nicht richtig, füllt mir wieder alles ausser bmBits.
Die Memberfunktion CBitmap::GetBitmapBits kann ich leider auch nicht nutzen.
Es muss doch ne möglichkeit geben aus dem CBitmap die Grafikdaten auszulesen...
 
Programmierst du etwa für Windows CE?

Ich glaube, dort gibt es aber die Funktion CreateDIBSection(). Wenn du mit dieser, statt mittels CreateCompatibleBitmap(), das Bitmap erzeugst, sollte später auch der bmBits-Member bei GetBitmap() bzw. GetObject() einen gültigen Zeiger enthalten.
 
Zurück