Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 06:12

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



c++ Winapi - Bitmap Farbarray verarbeiten

Discussion on c++ Winapi - Bitmap Farbarray verarbeiten within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jan 2009
Posts: 8
Received Thanks: 1
c++ Winapi - Bitmap Farbarray verarbeiten

Folgendes Problem:

Ein Abbild vom Desktop wird erstellt und die Bits werden mit passenden Bitmapheadern erfolgreich als Bitmap gespeichert.
Sprich ich bin schonmal sicher, dass ich die Bildinformationen richtig einlese und speicher.

Die Bits befinden sich also im Array pbBits.
Bitmap-typisch sind die Bildinformationen schon upside-down im Array,
daher geben auch pbBits[0], pbBits[1] und pbBits[2] Farbinformationen (BGR) des linken Pixel der untersten Zeile.
Auch die restlichen Pixel dieser Zeile haben die richtigen farbwerte (Ich habs manuell überprüft anhand des abgespeicherten Bildes).
Meine Bildschirmbreite ist 1366 und die Höhe 768.
Wenn ich nun also die nächste Zeile auslesen will, wäre dies doch Pixel 1366+1, daher pbBits[4101],pbBits[4102],pbBits[4103](hoffe bringe hier logische dinge nicht durcheinander). Leider stimmen diese Farbwerte nicht mit denen des Bildes überein, daher gehe ich nun davon aus, dass die Fehlerquelle hier liegt.

Erkennt jemand von euch Unstimmigkeiten? Oder kennt ganz und gar eine bessere möglichkeit?

hier die Funktion:
Code:
int CaptureScreen(){
	// RETURN VALUES
	// 0 failure
	// 1 Success
	//

	int     nWidth  = GetSystemMetrics(SM_CXSCREEN);
	int     nHeight = GetSystemMetrics(SM_CYSCREEN);
 
	HWND    hWnd    = GetDesktopWindow();
	HDC     hdc     = GetDC(hWnd);
	HDC     memDC   = CreateCompatibleDC(hdc);
	HBITMAP hbm     = CreateCompatibleBitmap(hdc, nWidth, nHeight);
	HBITMAP hbmOld  = (HBITMAP)SelectObject(memDC, hbm);
 
	BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);
                                 
	BITMAPINFO bmi;
 
	bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth        = nWidth;
	bmi.bmiHeader.biHeight       = nHeight;
	bmi.bmiHeader.biBitCount     = 24;
	bmi.bmiHeader.biPlanes       = 1;
	bmi.bmiHeader.biCompression  = BI_RGB;
	bmi.bmiHeader.biSizeImage    = 4 * nWidth * nHeight;

	BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage];

	GetDIBits( memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS );

	////Alle Informationen die eine Bitmap braucht hier der Fileheader
	BITMAPFILEHEADER bfh;
	bfh.bfType      = ('M' << 8) + 'B';
	bfh.bfSize      = sizeof(BITMAPFILEHEADER) +bmi.bmiHeader.biSizeImage +sizeof(BITMAPINFOHEADER); 
	bfh.bfReserved1 = 0;
	bfh.bfReserved2 = 0;
	bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	

	//speichern
			HANDLE hfile = CreateFile(L"c:\\temp\\screen.bmp",GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0); 
			DWORD dwWritten;
			WriteFile(hfile,&bfh,           sizeof(bfh),               &dwWritten, NULL); 
			WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER),  &dwWritten, NULL); 
			WriteFile(hfile,pbBits,         bmi.bmiHeader.biSizeImage, &dwWritten, NULL);
			CloseHandle(hfile);

		//verarbeitung
			int xxPos=750,yyPos=300;
			
		//TEST um zu gucken wie das Array nun wirklich aufgebaut ist... 1. zeile (yyPos=0) klappt ganz gut und stimmt
		//jedoch ab Zeile 2 yyPos=1 stimmen die Farbwerte nicht mit den manuell bestimmten Werten überein.
		FILE *fp;
		fp=fopen("c:\\temp\\test.txt", "w");
		
		fprintf(fp, "%d.",pbBits[yyPos*nWidth + xxPos*3]);  //blau
		fprintf(fp, "%d.",pbBits[yyPos*nWidth + xxPos*3+1]); //gruen
		fprintf(fp, "%d.",pbBits[yyPos*nWidth + xxPos*3+2]); //rot
		fprintf(fp, "# x%d y%d",xxPos,yyPos);

		fprintf(fp, "-------");
		fclose(fp);

	
	
	//clean up 
	SelectObject(memDC, hbmOld);
	DeleteDC(memDC);
	ReleaseDC(hWnd,hdc); 
	DeleteObject(hbm);
	delete[] pbBits;
	return 1;
}
Vielen Dank für eure Aufmerksamkeit
peace out
Knopfdruck is offline  
Old 01/16/2012, 17:17   #2
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Für mich wär eine andere Zeile eine Veränderung der Y-Achse. Liegt dort vllt dein Denkfehler?
MoepMeep is offline  
Old 01/16/2012, 18:54   #3
 
elite*gold: 0
Join Date: Jan 2009
Posts: 8
Received Thanks: 1
Durch yyPos*nWidth überspringe ich doch alle RGB Triplets einer Zeile um eine Zeile nach "oben" zu gelangen.

Wobei dabei fällt mir gerade aus, dass ich diesen wert nocheinmal mit 3 Multiplizieren muss, da es sich ja um Triplets handelt

sprich 1366*3(nWidth*3) wären alle Einträge einer Zeile
wenn ich dann yyPos=1 wähle um in die Zeile mit der Koordinate (xxPos | 1) zu kommen entspricht das 1*1366*3 + xxPos

jedoch stimmen die Koordinaten immernich nicht überein
Knopfdruck is offline  
Old 01/16/2012, 19:57   #4
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Ich muss gestehen, ich hatte mir den Code bisher nicht angeschaut. Mich hatte etwas am Text oben verwirrt.
Eine Zeile hat 1366Pixel(0-1365), also 4098 Felder im Array. Demzufolge wäre das ende des letzten Pixels bei [4097]. Pixxel 1367 fängt meiner Meinung nach bei [4098] an und nicht bei [4101].
MoepMeep is offline  
Thanks
1 User
Old 01/16/2012, 23:52   #5
 
elite*gold: 0
Join Date: Jan 2009
Posts: 8
Received Thanks: 1
Du hast Recht, da liegt der erste Fehler.
Bisher habe ich auch noch rausgefunden, dass scheinbar nach dem Ende einer Zeile eine Determinierer-Sequenz liegt. Jedenfalls sind 4098 und 4099 jeweils 0 und passen nicht in den Code.

Werde das morgen mal überprüfen und mir dann eine Gleichung schreiben Dann berichte ich mal ob es klappt oder immer noch nicht ;D
danke schonmal und schönen Abend noch
peace out


Alles klar nach dem ersten Kaffee des Tages habe ich den Fehler gefunden. Es Liegt tatsächlich an der berechnung der triplets... Einfach nur ärgerlich sowas, aber halt total logisch, das bei einer falschen berechnung alle folgenden Koordinaten falsch sind.

Daher vielen Dank @ MoepMoep, ohne den Fehler den du Aufgedeckt hast, hätte ich den folgenden gar nicht erst gesucht
Knopfdruck is offline  
Reply


Similar Threads Similar Threads
Failed to update Bitmap ....
07/13/2013 - Technical Support - 4 Replies
Hallo Com, ich habe seit einigen Tagen ein Problem beim Start meines Win7 Laptops. Wenn ich starte, läuft alles gut, aber sobald ich kurz vor dem Desktop bin. Sprich, beim Login Fenster, ist der Bildschirm schwarz und ein Fenster mit dem Titel expstart.exe und drin steht: Failed to update Bitmap (eine Zahl) :24 So in der Art. Wenn ich OK drücke, kommt das noch ein paar Mal und dann bin ich auch auf dem Desktop. Falls es hilft. Ich habe kein Passwort und bin der einzige Benutzer.
AfterEffects kan .mov nicht verarbeiten!
09/04/2011 - Technical Support - 2 Replies
Hallo, ich habe an meinen Workstation MAC ein Intro erstellt mit AE CS5. In dem Intro sind auch einige .mov´s drinnen,die lassen sich am PC eigentlich verarbeiten wenn man QuickTime installiert hat,tun Sie aber bei mir jetzt irgendwie nicht mehr. Ich habe es schon mit Reparieren,De/Neu-Installation versucht,aber nichts hilft!
Neu-->Bitmap geht nicht mehr [B]Elite*Gold
07/02/2011 - elite*gold Trading - 2 Replies
Hallo, Ich habe ein großes, wirklich großes Problem: Im Normalfall ist es so, dass wenn man Rechtsklick aufn Desktop macht, sich ein kleines Fenster öffnet und wenn man dann auf neu klickt, man sich eine neue .bmp Datei erstellen kann. Bei mir ist es jetzt jedoch so, dass Bitmap in dieser Liste fehlt, obwohl alles andere, wie z.b. Textdokument, noch da ist. Wer das problem löst, bekommt ein wenig E*Gold :)
GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber
10/29/2010 - AutoIt - 0 Replies
hi, ich habe nur eine kurze Frage, die sich nicht auf das Objekthandling in Autoit bezieht: Ich würde gerne wie die gdiplus.dll selber, eine Bitmap als Parameter in der DLL aufnehmen, bearbeiten und eine neue Bitmap zurückgeben. Was muss ich für Sachen Angeben damit $ret=Dllcall(".dll","none",&q uot;func","handle",$oldbmp,"pt r*","") $newbmp=$ret Ich hab in C++ im Moment Bitmap* Func(Bitmap*,bool), das Bitmap* als rückgabetyp scheint schonmal falsch zu sein
request moonbox tactics map bitmap for bjx
08/18/2005 - Conquer Online 2 - 0 Replies
Allright if wincave works with the map made from mystical castle i am betting that moonboxing will to with an older map. ;) (heard the the first version of bjx could make this) So here is my request I hope some has tried this and still have a map bmp still. If you do pls post it here pls :)



All times are GMT +1. The time now is 06:14.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.