# Bild mit Desktop vergleichen



## Doccos (3. Mai 2009)

Ich will 30 bilder mit dem Desktop vergleichen und ich komm damit einfach nicht klar ich habe schon in Google gesucht und auch in der Forum suche :/

Genau gesagt hab ich 30 kleine Bilder und will die an mehreren Stellen mit dem Desktop vergleichen.
Ich denke ich könnte nen screen vom Desktop machen und die einzelnen Bilder laden und die dann mit einer FOR Schleife pixelweise vergleichen.

Das Problem ist das ich keine Befehle finde für screenshot, bild öffnen, pixel vergleichen :/


----------



## Marschal (3. Mai 2009)

> ich habe schon in Google gesucht und auch in der Forum suche :/


Du willst gesucht haben?

Mein erster Treffer gleich beim ersten Suchen: 
c++ screenshot //erster treffer
c++ bild laden  //erster treffer
Pixel vergleichen //das ist sogar die Lösing zum Thema praktisch.

Alles sind Tutorials.de - Links, da kannst du mir nicht erzählen du hättest gesucht.


----------



## Doccos (3. Mai 2009)

ja nur bräuchte ich ein Tutorial wie das mit den Bildern genau geht ich ha da keinen Durchblick :/


----------



## Marschal (3. Mai 2009)

Ich bezweifle, dass es für dein speziefisches Anliegen ein fertiges How-to gibt. Dass musst du dir dan schon selbst erarbeiten. Wie gesagt, erstmal baust du dein Programm von der Logic her auf, und dan wird nach bestimmten Mehtoden, die du brauchst gegogelt. In deinem Fall Pixel vergleichen.
Wenn da dan irgendwo fheler und Probleme auftauchen, weil du nicht genau weist wie du eine Funktion anzuwenden hast, da können wir dir gerne helfen

Versuchs es erst mal selbst. Und wie immer sind Infos sehr nützlich. Programm, Vorkenntnisse...u.s.w.


----------



## Doccos (3. Mai 2009)

Naja also ich hatte vorher schon das hier probiert: 	Bitmap bm1( L"C:\\bilder\\1.bmp" );
Das ging auch, nur konnte ich 1 nicht mit der Variable i ersetzten  weil immer ein Error kommt


----------



## Marschal (3. Mai 2009)

Achso, ja das ist klar, du kannst eine variable nicht variabel machen. Der Kompiler will beim kompilieren des Codes wisse, wo genau die Variable liegt, und wenn du sie auch noch variabel machst, weis der Rechner doch garnicht wie wiele das nun werden sollen. Dein Vorhaben lässt sich Dynamisch lösen. (Dynamische Speicherverwaltung).
Dies erfordert jedoch ein gewisses Grundwissen. Ich schätze du hast dich bisher nicht in die objektorientierte Programmierung gewagt.

Deswegen empfehle ich dir deine Bitmaps in einem Array zu speichern. Der unterschied zu der Dynamischen Speicherverwaltung ist, dass auch bei einem Array nur begrenz Bilder abgelegt werden können, eben so viele wie du dein Array angelegt hast. Dynamisch heist ja, dass das Programm entscheidet, wärend der Laufzeit, wie viel Speicher es braucht. (Gutes Bsp. Windoofs Word legt dir beim anlegen eines neuen Dokumentes auch nicht so viele leere Seiten an, wie du RAM hast, sondern immer nur eine, und wenn die voll ist, wird die nächste im RAM abgelegt)

Nun zum Array: Versuche doch volgendes..

```
Bitmap bmp[20]; //nun hast du speicher für 20 Bitmaps belegt
bmp[0]=( L"C:\\bilder\\1.bmp" ); /*jezt ist das aller erste element mit einer bitmap belegt*/
bmp[19]=NULL; /*Damit belegst du das lezte Element des Arrays*/
bmp[20]=NULL; /*dies würde einen Crash verursachen, den für diese Belegung ist 
kein Platz im Arbeitsspeicher belegt worden...(zum Glück erkennt Windoofs das heut 
zu tage^^ früher gab es an dieser Stelle nur einen Reboot)*/
```


----------



## Doccos (4. Mai 2009)

Ah super danke das werd ich heut Abend gleich probieren.
Das ich alle Bilder in nen Array mache darauf hätte ich selber auch kommen können ...
danke nochmal


----------



## Doccos (4. Mai 2009)

Hmmmm geht leider nicht :/
Wenn ich das mit dem Array Probier bekomme ich folgende Errors:
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(21) : error C2512: 'Gdiplus::Bitmap': Kein geeigneter Standardkonstruktor verfügbar
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(22) : error C2248: "Gdiplus::Bitmap:perator =": Kein Zugriff auf private Member, dessen Deklaration in der Gdiplus::Bitmap-Klasse erfolgte.


----------



## Marschal (4. Mai 2009)

Hm.. Klingt als wäre Bitmap eine Klasse. Dan fuktioniert das ganze etwas anders. wie erfolgt den bei dir der Zugriff.
Als du es ohne das Array gemacht hattest, hate der "="-Operator ja hunktioniert, oder?

Poste mal den Codeschnippsel, wo du dein array anlegst, und da wo du es verwendest bitte.


----------



## Doccos (4. Mai 2009)

int vergleich(int posx, int posy, int typ)
{

	Bitmap  bm2[5];
	bm2[0]=( L"C:\\bilder\\0.bmp" );
	bm2[1]=( L"C:\\bilder\\1.bmp" );
	bm2[2]=( L"C:\\bilder\\2.bmp" );
	bm2[3]=( L"C:\\bilder\\3.bmp" );
	bm2[4]=( L"C:\\bilder\\4.bmp" );


	Bitmap bm1( L"C:\\bilder\\0.bmp" ); // <-- das funktioniert


----------



## Marschal (4. Mai 2009)

Dan logische Schlussvolgerung
benutze deine Funktion wie folgt:

```
Bitmap bm2[5];
bm2[0]( L"C:\\bilder\\0.bmp" );
bm2[1]( L"C:\\bilder\\1.bmp" );
bm2[2]( L"C:\\bilder\\2.bmp" );
bm2[3]( L"C:\\bilder\\3.bmp" );
bm2[4]( L"C:\\bilder\\4.bmp" );
```

"Bitmap" ist allen Anscheins nach eine Klasse. Du legst 5 Objekte der Klasse an.
Siehe Zeile:

```
Bitmap bm2[5];
```
Diese sind KEINE variablen! Mit der Zeile:

```
bm2[0]( L"mein Pfad" );
```
rufst du den Dafaul-Konstruktor auf. Dies ist eine Funktion, ind der dan schon etwas passiert. Was genau da läuft kannst du naschsauen, in dem du auf deine Klasse klickst (als auf Bitmap) und dan REchtsklick->Deklaration.
Es solte sich die zugehörige CBitmap.h oder CBitmap.cpp öffnen

EDIT: Tip! Lege dein Bitmap array auserhalb jeglicher Funktionen auf! Alo direkt unter deinen Includes Somit ist sicher, dass rechtzeitig alle Variablen zur Verfügung stehen


----------



## Doccos (4. Mai 2009)

Ich bekomm beim Array aber schon folgende fehlermeldungen:


```
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(30) : error C2512: 'Gdiplus::Bitmap': Kein geeigneter Standardkonstruktor verfügbar
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(31) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(32) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(33) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(34) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(35) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
```


----------



## Marschal (4. Mai 2009)

Ach stimmt. Tschuldige, hatte ich obern überlesen. Bitmap ist eine KLassen, man kann immer nur ein OBjekt einer Klasse anlegen, also so:

```
Bitmap bmp; //Bitmap ist die Klasse, und bmp deren Objekt
```

Ich sehe hier in deinem Fall leider keinen Ausweg mehr. Du musst das dynamisch regeln immer mit new ein neues Ojekt anlegen lassen, und ieses dan in einer Liste verwalten.

Oder du nimmst di unschöne Variante, und legst einfach dein Programm aus, angenommen für maximap 5 Bitmaps, und deklarierst das dan gleich so:

```
Bitmap bm1( L"C:\\bilder\\0.bmp" );
Bitmap bm2( L"C:\\bilder\\1.bmp" );
Bitmap bm3( L"C:\\bilder\\2.bmp" );
Bitmap bm4( L"C:\\bilder\\3.bmp" );
Bitmap bm5( L"C:\\bilder\\4.bmp" );
```

Wenn du dich für die elegant Methode der Liste und der Dynamischen Speicher verwaltung entscheidest (nen sehr groser Lernanteil) helfe ich dir gerne dabei, da durchzusteigen


----------



## Doccos (4. Mai 2009)

Hmmm da weiß ich gar net wie ich anfangen soll ^^
Ich hatte auch schon probiert per switch anweißung alle nach der reihe aufzurufen aber irgentwie gings nicht :/
Ich werd es jetzt noch auf eine andere Art versuchen und wenn das nicht klappt wäre mir deine Hilfe sehr Wilkommen 

Kleine Frage noch:
gibts wo ne Site wo alle Funktionen on C++ aufgelistet sind?


----------



## devDevil (5. Mai 2009)

Arg was nen Schwachfug 

```
Bitmap  bm2[5];
```
 Das legt dir einen Array von Bitmap-Objekten der Größe 5 an (d.h. Index von 0 ... 4). Dabei wird der Default-Konstruktor von Bitmap aufgerufen.

```
bm2[0]=( L"C:\\bilder\\0.bmp" );
```
 Da versuchst du dann sozusagen folgendes aufzurufen:

```
Bitmap& Bitmap::operator=(const wchar_t*)
```
 ... Gibt es aber nicht. Was noch möglich wäre, ein impliziter Kontruktor von Bitmap mit nur dem String als Parameter ... aber nein auch das ist nich der fall 


```
bm2[0] = Bitmap( L"C:\\bilder\\0.bmp" );
```
 da erzeugst du erst noch nen neues Bitmap-Objekt und weißt dann per Zuweisungsoperator dem Array-Element [0] das neue Bitmap-Objekt zu. Aber da der Zuweisungsoperator ja private ist ... vergiss es 


```
Bitmap* bm2[5];
bm2[0] = new Bitmap( L"C:\\bilder\\0.bmp" );
// benutzen ...
Bitmap& bmp(*bm2[0]);
// am ende auch freigeben ...
delete bm2[0];
```
 ...

ehm und

```
Bitmap bmp[20]; //nun hast du speicher für 20 Bitmaps belegt
bmp[19]=NULL; /*Damit belegst du das lezte Element des Arrays*/
```
 ... dazu sag ich einfach mal nix ... nem Objekt NULL (0) zuweisen .... und der rest ist auch schwachsin


----------



## Doccos (5. Mai 2009)

Oh super 
Also ich werd es morgen gleich testen dann sag ich bescheid
Danke schonmal


----------



## Doccos (7. Mai 2009)

Also irgentwie komm ich mit dem Screenshot machen nicht klar :/
Hab grad ganz Google durchsucht aber keines der Scripte funktionierte irgentwie :/

Also ich will das zb Bitmap bm1 der Desktop ist wie stelle ich das am besten an ?


----------



## Doccos (12. Mai 2009)

Kann mir keiner helfen irgentwie funktioniert das unter Vista nicht :/


----------



## vfl_freak (12. Mai 2009)

Moin,



Doccos hat gesagt.:


> Also irgentwie komm ich mit dem Screenshot machen nicht klar :/
> Hab grad ganz Google durchsucht aber keines der Scripte funktionierte irgentwie :/


 
Hmm - also *irgendwie* funktioniert *irgendwas* nicht ....

Du sagst hier weder genau was nicht funktioniert noch lieferst Du irgendwelche Details (Code etc.)!

Und dann wunderst Du Dich, wenn keiner reagiert  ? ? ?

Gruß
Klaus


----------



## Doccos (12. Mai 2009)

Ja weil ich ziemlich viel Varianten probiert habe

Geht das nicht irgentwie mi GDI+ ?


----------



## vfl_freak (12. Mai 2009)

Doccos hat gesagt.:


> Also irgentwie komm ich mit dem Screenshot machen nicht klar


Nochmal: erkläre doch mal genau, womit Du denn nicht klar kommst ..... 



Doccos hat gesagt.:


> Hab grad ganz Google durchsucht aber keines der Scripte funktionierte irgentwie


Was für Skripte ? ? ?
Was genau hat nicht funktioniert ? ? ?

Zum Raten wird keiner Lust haben .....;-]

Gruß
Klaus


----------



## Doccos (12. Mai 2009)

Ich hab zb das hier probiert: http://www.tutorials.de/forum/c-c/240241-screenshot-wieso-funktioniert-das-nicht.html

Aber außer Fehler kamen nur Fehler -.-


----------



## vfl_freak (12. Mai 2009)

Doccos hat gesagt.:


> Aber außer Fehler kamen nur Fehler -.-


 
nee - is' klar ......... :suspekt:


----------



## Doccos (12. Mai 2009)

Kann mir wenigstens einer sagen welche Befehle ich verwenden muss oder irgentwas was mir vllt helfen könnte?....


----------



## Doccos (12. Mai 2009)

Wenn ichs so mach:

```
Bitmap bm2 (BitBlt(GetDC(0), 300, 300, 1600, 900, GetDC(0), 0, 0, SRCCOPY));
```

kommt der Error 


```
1>c:\users\doc\documents\visual studio 2008\projects\uebung2\uebung2\main.cpp(240) : error C2664: 'Gdiplus::Bitmap::Bitmap(const WCHAR *,BOOL)': Konvertierung des Parameters 1 von 'BOOL' in 'const WCHAR *' nicht möglich
1>        Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
```


/////////////// edit
So ich habs glaub ich also es funktioniert schonmal ziemlich gut


----------



## Marschal (12. Mai 2009)

> So ich habs glaub ich also es funktioniert schonmal ziemlich gut



Also wenn dus jezt hast, dan klicke doch bitte auf erledigt, und bewerte dan doch bitte die Leute, die dir eholfen und Zeit investiert haben


----------



## Doccos (12. Mai 2009)

na eine frage hab ich noch wie geb ich ein Bitmap wieder frei ?
Weil nach einiger Zeit is mein Arbeitsspeicher voll


----------



## vfl_freak (12. Mai 2009)

Moin,

ich weiß zwar noch immer nicht, was Du wie machst, aber so aus dem Bauch heraus würde ich vorschlagen: so wie allen Objekten (ich hoffe, es ist  bei Dir auch eins):

```
myBitMap = null;
```
Das hilft eigentlich immer!

Gruß
Klaus


----------



## Marschal (12. Mai 2009)

mit memset() kannst du variablen wieder "freigeben".
Du meinst aber während der Laufzeit richtig?


----------



## Doccos (12. Mai 2009)

Also eigentlich weiß ich nicht was mir soviel Arbeitsspeicher nimmt aber wenn er ca 5 Minuten den Desktop vergleicht sind 2.5 GB Arbeitspeicher belegt. Ich dachte wenn ich immer auf bm1 bzw bm2 Speichere wird das immer überschrieben, was hier aber nicht der Fall ist :/

Deswegen möchte ich nach dem Vergleich bm1 und bm2 freigeben (Beide sind Bitmap Dateien)


----------



## Marschal (12. Mai 2009)

nun, mit zwei bitmaps belegst du höchstens 1mb schätzungsweise. Dein Fall klingt sehr nach Speicherleck. Benuzt du irgendwo new in einer Schleife ohe es wieder mit delete zu löschen?

-----------------------------------------------------------------------------------------------------------



			
				devDevil hat gesagt.:
			
		

> ehm und
> 
> ```
> Bitmap bmp[20]; //nun hast du speicher für 20 Bitmaps belegt
> ...


mir ist klar das ein Objekt nicht mit NULL belegt werden kann-.- Dies diente eher der Symbolik. Des weiteren siehe da:
http://www.tutorials.de/forum/c-c/339858-bild-mit-desktop-vergleichen.html#post1756896.

Habe ich mich hier nicht zu meinem eigenen Schwachsinn bekannt, und mich folglich korregiert?

-----------------------------------------------------------------------------------------------------------



			
				Doccos hat gesagt.:
			
		

> Kleine Frage noch:
> gibts wo ne Site wo alle Funktionen on C++ aufgelistet sind?



Oh doch die gibt es^^ Z.b. die msdn datenbank von Microsoft. Seeehr Umfangreich
Poste doch mal deinen kompltetten Programmcode hier. Würde mir jetzt mal gerne anschauen, wie du es realisiert hast (vorrausgesetzt du bist mit der Veröffentlichung deines Codes einverstanden)


----------



## Doccos (12. Mai 2009)

Ich hab eigentlich in meinem Script niergents nen New drinnen 


Das is das Script zum Bildervergleich:

```
int vergleich(int posx, int posy, int typ)
{
	bposx = posx;
	bposy = posy;

int q = 0;
int ergebniss = 1;
	int ruck;	

		  
		  // GDI+ initialisieren
		  GdiplusStartupInput gdiplusStartupInput;
		  ULONG_PTR gdiplusToken;
		  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
		
		  // Scopeklammern, damit alle Objekte vor GdiPlusShutdown zerstört sind
		    {
    Bitmap bm1( L"C:\\bilder\\vergleich.bmp" );

SRCCOPY));
		HDC Screen = GetDC(0);
		HBITMAP Capture = CreateCompatibleBitmap(Screen, 1680, 920);
		HDC Image = CreateCompatibleDC(Screen);
		HBITMAP OldBitmap = (HBITMAP)SelectObject(Image, Capture);
		BitBlt(Image, 0, 0, 1680, 920, Screen,
		0, 0, SRCCOPY);
		SelectObject(Image, OldBitmap);

		Bitmap* bm2 = Bitmap::FromHBITMAP(Capture,NULL);
	
		do {
		  if( q >= 14)
		  {
			ergebniss = 2;
			
		  }			

      int nDifferentPixels = 0;
      Color color1, color2;
      for( int x=0; x<22; ++x ) {
        for( int y=0; y<15; ++y ) {
          if( Ok == bm1.GetPixel( x+(22*q),y, &color1 ) && Ok == bm2->GetPixel( bposx - 22 + x,bposy - 15 + y, &color2 ) ) {
            if( color1.GetValue() != color2.GetValue() ) {
              ++nDifferentPixels;

            }
          }
        }
     }
	
	if(nDifferentPixels <= 1)
			  {
				//deleteDC(bm2);
				//delete bm1;
					 
					  return q;
				
			  }
      //
	  //cout << "Unterschiedliche Pixel: " << nDifferentPixels << " Q: " << q << " X: " << bposx << " Y: " << bposy << endl;
			/*  if(nDifferentPixels <= 1)
			  {
				  
					 cout << "-----> Unterschiedliche Pixel: " << nDifferentPixels << " Q: " << q << " X: " << bposx << " Y: " << bposy <<  endl;
      int nDifferentPixels = 0;
      Color color1, color2;
      for( int x=0; x<22; ++x ) {
        for( int y=0; y<15; ++y ) {
          if( Ok == bm1.GetPixel( x+(22*q),y, &color1 ) && Ok == bm2.GetPixel( bposx - 22 + x,bposy - 15 + y, &color2 ) ) {
            if( color1.GetValue() != color2.GetValue() ) {
              ++nDifferentPixels;
				cout << "x " << x << " y " << y << endl;
            }
          }
        }
      }

			  } */

   
	  

	 
	++q;
	} while(ergebniss != 2);
		  
	//cout << "return " << q << endl;
  }
	  GdiplusShutdown(gdiplusToken);
	  Sleep(1000);
	  return ruck;
}
```


//////////////////////EDIT///////////////////////
Also hab grad getestet wenn er immer das gleiche Bild nimmt also kein neuen Screenshot macht verändert sich der Arbeitsspeicherverbrauch nicht also muss es daran liegen


----------



## Marschal (12. Mai 2009)

Hm.. Also dieser Codeschnipsel hilft mir nicht viel (ist ja eh die hälfte code auskommentiert). Aber an deiner Funkton scheint nix tolles dran zu sein. Jedoch eine Frage du Lädst dein Vergleichsbild immer wieder neu(beim Funktionsaufruf), was eigentlich nicht weiter dramatisch, aber unschön ist. Aber du machst auch immer wieder neue Screenshots...

Wie oft und wie rufst du deine Funktion den Auf?


----------



## Doccos (12. Mai 2009)

Die Funktion wird ca alle 2 Sekunden aufgerufen
Aber wie gesagt wenn ich bm2 mit einen Bild austausche was immer gleich ist bleibt der Arbeitsspeicher unverändert also muss es irgentwo hier liegen:


```
HDC Screen = GetDC(0);
		HBITMAP Capture = CreateCompatibleBitmap(Screen, 1680, 920);
		HDC Image = CreateCompatibleDC(Screen);
		HBITMAP OldBitmap = (HBITMAP)SelectObject(Image, Capture);
		BitBlt(Image, 0, 0, 1680, 920, Screen,
		0, 0, SRCCOPY);
		SelectObject(Image, OldBitmap);

		Bitmap* bm2 = Bitmap::FromHBITMAP(Capture,NULL);
```


----------



## Marschal (12. Mai 2009)

Kopier diesen Code doch mal Raus aus der Schleife und mach ihn testweise global (in keine Funktion, über die main, unter die includes).

Kenne die Bitmap Klasse nicht, aber es Scheint, dass du bei jedem Funktionsaufruf ein neues Screenshot machst, und dieser dan unnötig Arbeitspeicher frist.


----------



## Doccos (12. Mai 2009)

Er soll auch bei jedem Funktionsaufruf ein Screenshot machen


----------



## Marschal (12. Mai 2009)

Hm. Probiers mit memset(); Weil ich weis grad echt nicht an welcher Stelle dein Speicherleck entsteht


----------



## Doccos (12. Mai 2009)

Hmmm kann mir einer Memset() erklären ?
Find nichts was Memset() mit Speicher räumen zu tun hat :/


----------



## Marschal (12. Mai 2009)

in etwa so:

```
int test = 100;

cout<<test; //Ausgabe = 100

memset ( test, 1, sizeof( test ) );

cout<<test; //Ausgabe = 1;
```

Aufdein Besipiel übetragen

..du findest nix zu funktionen. DAS sollte immer deine erste Anlaufstelle sein, bevor du nach erklärungen zu funktionen suchst


----------



## deepthroat (12. Mai 2009)

Hi.

Du mußt das Bitmap Objekt welches du durch den Aufruf von Bitmap::FromHBITMAP erzeugt hast mit delete freigeben wenn du es nicht mehr brauchst. 

Gruß


----------



## Doccos (13. Mai 2009)

Sobald ich :
		delete OldBitmap;
		delete Capture;	
drinnen habe stürzt mein Konsolenfenster ab :/


----------



## deepthroat (13. Mai 2009)

Doccos hat gesagt.:


> Sobald ich :
> delete OldBitmap;
> delete Capture;
> drinnen habe stürzt mein Konsolenfenster ab :/


Dann hast du was falsch gemacht.


----------



## Doccos (13. Mai 2009)

Sowie ich die zwei Zeilen eingefügt hatte stürzte die Konsole ab


----------



## deepthroat (13. Mai 2009)

Doccos hat gesagt.:


> Sowie ich die zwei Zeilen eingefügt hatte stürzte die Konsole ab


Dann hast du etwas falsch gemacht.


----------



## Doccos (13. Mai 2009)

Das Fenster stürzt erst ab seitdem ich die 2 Zeilen drinnen habe.


----------



## deepthroat (13. Mai 2009)

Doccos hat gesagt.:


> Das Fenster stürzt erst ab seitdem ich die 2 Zeilen drinnen habe.


Ja, das sagtest du schon. Du hast trotzdem irgendetwas falsch gemacht.


Spoiler



bin ja mal gespannt wie lange es dauert bis er/sie endlich mal kapiert das man ohne den Quellcode zu sehen nicht sagen kann wo der Fehler liegt...


----------



## vfl_freak (13. Mai 2009)

deepthroat hat gesagt.:


> Dann hast du etwas falsch gemacht.



Hallo Doccus,
wie wäre es, wenn Du den entsprechenden Code postest - sonst spielt ihr das Spielchen solange, bis deepthroat die Lust vergeht :suspekt:

Gruß
Klaus


----------



## deepthroat (13. Mai 2009)

vfl_freak hat gesagt.:


> Hallo Doccus,
> wie wäre es, wenn Du den entsprechenden Code postest - sonst spielt ihr das Spielchen solange, bis deepthroat die Lust vergeht :suspekt:


Nee, nee. Fing gerade an mich zu amüsieren... 

Gruß


----------



## vfl_freak (13. Mai 2009)

ja, sorry aber auch - hatte sich leider überschnitten ;-]

Klingt ja so, als ob Diene Glaskugel auch zur Reparatur wäre ..... ^^

LG 
Klaus


----------



## deepthroat (13. Mai 2009)

vfl_freak hat gesagt.:


> ja, sorry aber auch - hatte sich leider überschnitten ;-]
> 
> Klingt ja so, als ob Diene Glaskugel auch zur Reparatur wäre ..... ^^


Nein, hab sie bloss irgendwo verlegt... grad nicht zur Hand. Es ist nicht meine Woche. 

Gruß


----------



## Marschal (13. Mai 2009)

Ich glaube wir sollten einen Mod diesen Thread in das Fun Forum schieben lassen^^ Das ist ja bald wie sven Uwe hier


----------



## Doccos (14. Mai 2009)

So hier is der Code:


```
int ruck;

int vergleich(int posx, int posy, int typ)
{
	bposx = posx;
	bposy = posy;

int q = 0;
int ergebniss = 1;
		
	

		  
		  // GDI+ initialisieren
		  GdiplusStartupInput gdiplusStartupInput;
		  ULONG_PTR gdiplusToken;
		  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
		
		  // Scopeklammern, damit alle Objekte vor GdiPlusShutdown zerstört sind
		    {
    Bitmap bm1( L"C:\\bilder\\vergleich.bmp" );


   // Bitmap bm2( L"C:\\bilder\\desktop.bmp" );
	 //Bitmap bm2 (BitBlt(GetDC(0), 300, 300, 1600, 900, GetDC(0), 0, 0, SRCCOPY));
		HDC Screen = GetDC(0);
		HBITMAP Capture = CreateCompatibleBitmap(Screen, 1680, 920);
		HDC Image = CreateCompatibleDC(Screen);
		HBITMAP OldBitmap = (HBITMAP)SelectObject(Image, Capture);
		BitBlt(Image, 0, 0, 1680, 920, Screen,
		0, 0, SRCCOPY);
		SelectObject(Image, OldBitmap);

		Bitmap* bm2 = Bitmap::FromHBITMAP(Capture,NULL);

		
		do {
		  if( q >= 14)
		  {
			ergebniss = 2;
			
		  }			

      int nDifferentPixels = 0;
      Color color1, color2;
      for( int x=0; x<22; ++x ) {
        for( int y=0; y<15; ++y ) {
          if( Ok == bm1.GetPixel( x+(22*q),y, &color1 ) && Ok == bm2->GetPixel( bposx - 22 + x,bposy - 15 + y, &color2 ) ) {
            if( color1.GetValue() != color2.GetValue() ) {
              ++nDifferentPixels;

            }
          }
        }
     }
	//delete bm2;
	if(nDifferentPixels <= 1)
			  {
				//deleteDC(bm2);
				//delete bm1;
					 
					  ruck =  q;
					break;
			  }


   
	  

	 
	++q;
	} while(ergebniss != 2);
	 delete OldBitmap;
	 delete Capture;	
	 DeleteDC(Image);
	 DeleteDC(Screen);

  }


	  GdiplusShutdown(gdiplusToken);
	  Sleep(1000);
	 
	  return ruck;
}
```


----------



## deepthroat (14. Mai 2009)

Hi.

Das ist schon besser. Aber kannst du bitte mal den Code ordentlich einrücken und formatieren. Und bitte verwende die [code=cpp]...[/code] Tags für C++ Code. Wenn du das vorher schon gemacht hättest, dann hätte ich dir gleich sagen können (weil ich es dann gesehen hätte), dass es Unsinn ist das OldBitmap löschen zu wollen. Das ist doch überhaupt kein Zeiger?! 

Außerdem hab ich dir gesagt du sollst das *Bitmap* Objekt welches du mit der Bitmap::FromHBITMAP erzeugt hast mit delete freigeben.

Die HBITMAP Objekte mußt du mit DeleteObject freigeben. Das steht aber alles im MSDN beschrieben <wink-mit-dem-Zaunpfahl/>!

Gruß


----------

