Grafik daten ermitteln

Ich habe mit dieser Funktion immer ganz brauchbare Ergebnisse erzielt:

Code:
HBITMAP Create24BPPDIBSection(HDC hDC, int iWidth, int iHeight)
{
    BITMAPINFO	bmi;
    HBITMAP     hbm;
    LPBYTE      pBits;

    ZeroMemory(&bmi, sizeof(bmi));

    bmi.bmiHeader.biSize		= sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth		= iWidth;
    bmi.bmiHeader.biHeight		= iHeight;
    bmi.bmiHeader.biPlanes		= 1;
    bmi.bmiHeader.biBitCount	        = 24;
    bmi.bmiHeader.biCompression         = BI_RGB;

    hbm = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
      
    return hbm;
}
 
Ich glaub die Funktion hast du schon mal gepostet. Hatte die auch schon für meine "Transparenz" genutzt...

Bin jetzt soweit das ich "gültige" Werte erhalte nur leider wird alles Schwarz.

Auch wenn er nur zum Quick & Dirty Test reicht hier mal mein Code (nicht erklärte Variablen haben die richtigen werte ;) )
Code:
			CDC memDC;
			CBitmap bmp;
			
			memDC.CreateCompatibleDC(pDc);
			bmp.CreateCompatibleBitmap(pDc, bi->bmWidth, bi->bmHeight);

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

			BITMAPINFO    bmi;
			HBITMAP        hbm;
			LPBYTE        pBits;

			ZeroMemory(&bmi, sizeof(BITMAPINFO));

			memDC.BitBlt( 0,0,bi->bmWidth, bi->bmHeight, pDc,0,0,SRCCOPY );

    // bmp enthält jetzt die Bilddaten
			memDC.SelectObject(pOldBitmap);

			BITMAP bgr;

			bmp.GetBitmap(&bgr);
			
			bmi.bmiHeader.biSize  = sizeof(BITMAPINFOHEADER);
			bmi.bmiHeader.biWidth = bgr.bmWidth;
			bmi.bmiHeader.biHeight = bgr.bmHeight;
			bmi.bmiHeader.biPlanes = bgr.bmPlanes;//laut Debug == 1
			bmi.bmiHeader.biBitCount = bgr.bmBitsPixel;//laut Debug == 24
			bmi.bmiHeader.biCompression = BI_RGB;

			hbm = CreateDIBSection(memDC.GetSafeHdc(), &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);

			CBitmap hallo;
			hallo.Attach(hbm);

			ZeroMemory(&bgr,sizeof(BITMAP));
			hallo.GetBitmap(&bgr);

			int i;
			BYTE *pixel = (BYTE*)bgr.bmBits;

			for(i=0 ; i<(bgr.bmWidth*bgr.bmHeight*bgr.bmBitsPixel)/8; i++)
				if(pixel[i] != 0)
					pixel[i] = 0;

			hallo.Detach();

			CBitmap test;
			test.CreateBitmapIndirect(&bgr);
			CBitmap *oldtest;

			oldtest = memDC.SelectObject(&test);


		
			pDc->StretchBlt(Zoom.left,Zoom.top,Zoom.Width(),Zoom.Height(),&memDC,Cut.left,Cut.top,Cut.Width(),Cut.Height(),SRCCOPY);//ab jetzt ist alles schwarz
			memDC.SelectObject(oldtest);
 
Ach ja was auch wichtig ist:
Die OnPaint hat folgenden Aufbau:

- Anfang OnPaint()
- zeichne sicher was butes auf "pDc"
- dann Funktion mit meinem Problem
- Ende OnPaint();
 
Ach richtig, die Tansparenzgeschichte!

Wenn du CreateDIBSection() verwendest, brauchst du CreateCompatibleBitmap() nicht mehr.
Das müsste dann etwa so laufen:

Code:
CDC memDC;
memDC.CreateCompatibleDC(pDc);

BITMAPINFO bmi;
LPBYTE     pBits;

ZeroMemory(&bmi, sizeof(BITMAPINFO));

bmi.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth       = bi->bmWidth;
bmi.bmiHeader.biHeight      = bi->bmHeight;
bmi.bmiHeader.biPlanes      = 1;
bmi.bmiHeader.biBitCount    = 24;
bmi.bmiHeader.biCompression = BI_RGB;

HBITMAP hbm    = CreateDIBSection(memDC.GetSafeHdc(), &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
HBITMAP hbmOld = ::SelectObject(memDC.GetSafeHdc(), hbm);

memDC.BitBlt(0, 0, bi->bmWidth, bi->bmHeight, pDc, 0, 0, SRCCOPY);

BITMAP bgr;
::GetObject(hbm, sizeof(bgr), &bgr);

// ...

::SelectObject(memDC.GetSafeHdc(), hbmOld);
::DeleteObject(hbm);

Kann man das irgendwie abstellen, das innerhalb der Code-Tags Doppelpunkt + "D" verhunzt wird :mad: ?
 
Zuletzt bearbeitet:
Weiß zwar jetzt nicht genau warum das jetzt irgendwie funktioniert aber kriege irgendwas angezeigt, was ungefähr dem entspricht was ich haben will. Nur ist das jetzt verzerrt, und irgendwie geschnitten, sieht wizig aus. Das das gespiegelt ist halte ich jetzt einfach mal für normal, da das ja so im Speicher liegt...
Ach ja die Farben sind auch nicht gerade gleich...
Dat blöde Dinge bringt einen echt noch zur weiß-Glut...Dabei fällt mir gerade ein könnte noch nen Cast-Fehler gemacht haben... schauen wir mal...
 
Zuletzt bearbeitet:
Also irgendwie versteh ich das mit den Speicherbereichen,Farbwerten und dem was ich hier seh nicht, Hab mir da ne 2*2 Bitmap erstellt und die Daten die ich im BITMAP Struct erhalte stimmen auch nur der Zeiger auf den Speicherbereich ist voll verhunzt. Meine Überlegung war:
Ich habe eine Bitmap in 24Bit gespeichert -> macht 3Byte pro Pixel
Ein Byte entspricht dann R oder G oder B und der Farbwert ist klar im Speicher abzulesen.
Meiner Meinung nach sollten dann im Speicher auch die RGB-Farbwerte zusehen sein. Kriege aber leider alles nur auf Weiß und Schwarz im Speicher zu Gesicht und wenn ich das dan anzeige, gibts ne einheitliche blaue Fläche...

Kümmer mich jetzt erstmal um nen anderes Problem, soll ja manchmal helfen den Kopf frei zu kriegen :)

Falls euch noch ne Idee kommt bin ich für jede Hilfe dankbar.

Gruß Michael
 
So ich glaube ich habe soweit meine Probleme in den Griff bekommen.

Vielleicht für die Nachwelt einige Tipps - man muss das Rad ja nicht immer neu entdecken:)
1) man sollte alle Bilddaten in 24 Bit-Bitmaps wandeln - dann klappt es auch mit dem vergleichen/miteinander verrechnen
2) man muss den Rückgabewert von Create24BPPDIBSection einmal am ende durch DeleteObject schicken. Sonst ist man seinen Speicher ganz schnell quit.

Danke aber erstmal für die Hilfe hat mir echt weitergeholfen.

Gruss Michael
 
Zurück