# Bilder vergleichen



## Flocke (19. Okt 2005)

Hallo allerseits.
Habe Momentan ein Problem mit dem Vergleichen von Bildern. Und zwar meine Bilder sind auf JLabels. Die JLabels selbst haben keine Namen, da die Bilder durch eine Schleife automatisch angelegt und in einem Array abgespeichert werden. Zusätzlich habe ich ein wilkürliches Bild auf einem gesondertem JLabel (mit Namen) abgespeichert. Ich möchte nun das Array nach diesem Bild durchsuchen. Ist es im Array, so soll eine Meldung erfolgen.
Mit  

```
if (gesuchtesBild.equals(bildArray[x]))
 System.out.println("Das Bild liegt im Array");;
```
funktioniert es nicht. Hab' auch schon mit 

```
if((gesuchtesBild.getIcon()).equals(bildArray[x].getIcon())) 
System.out.println("Das Bild liegt im Array");
```
versucht. Aber es kommt weder eine Fehlermeldung, noch gibt es weitere Reaktionen.
Kennt jemand einen Rat?
Danke


----------



## André Uhres (19. Okt 2005)

Die standard Methode "equals()" gibt nur dann "true" zurück, wenn beide Referenzen auf dasselbe Objekt zeigen.
Das "willkürliche Bild" müsste dann also physisch ein Objekt aus dem Array sein.


----------



## Flocke (20. Okt 2005)

Danke Andre.
Es ist aber bei mir eindeutig nicht der Fall und ich kriege es so auch nicht hin. Ich bastle nämlich an einem Spiel bei dem eine Reihe von unterschidlichen Zeichen geraten werden soll. Als Antwort auf den Rateversuch wird dann entweder ein Bild für "richtiges Zeichen am richtigen Ort", "Zeichen kommt gar nicht vor"  oder "das Zeichen ist richtig, aber der Ort ist verkehrt" im JPanel ausgegeben. Ich möchte nun, dass, wenn das Symbol für "richtiges Zeichen am richtigen Ort" das gesammte Feld ausfüllt, eine Meldung, wie "Sie haben gewonnen" kommt.
Weiß jemand, wie ich es bewerkstelligen kann?


----------



## André Uhres (20. Okt 2005)

Du könntest einen Bilder-Katalog anlegen, wobei das "Key" zu
den Bildern einfach eine laufende Nummer ist.
Um das willkürliche Bild anzuzeigen, nimmst du einfach ein
Bild aus dem Katalog und vermerkst zusätzlich die entsprechende Nummer des Bildes. 
Das Array mit den zu ratenden Bildern legst du so an, dass es nur die Nummern der Bilder 
enthält und nicht die Bilder selbst.
Du vergleichst dann also keine Bilder mehr, sondern einfach nur die Bild-Nummern.


----------



## thE_29 (20. Okt 2005)

Du überschreibst dir entweder die Klasse ICON oder IMAGE mit MyICON oder MyIMAGE und merkst dir einen Schlüssel zu dem Bild (statischen Counter, oder sonstiges)

Dann baust dir noch ne equals Methode oder fragst gleich auf die Keys ab und schwups wups gehtz ;>


----------



## Flocke (20. Okt 2005)

Danke. Werde ich beides ausprobieren


----------



## Gast (6. Feb 2007)

Entschuldigung das ich die Leiche hier schände, aber die Suche gab nicht mehr her und es scheint auch genau zu meiner Frage zu passen.
Wenn doch nicht, dann bitte nicht hauen 

Kann man Bilder mit equals() vergleichen? Oder muss man das immer über umwege machen.
Denn aus dem Thread hier kann ich das nicht so direkt rauslesen ob es generel nicht geht oder ob es nun am speziellen Fall hier liegt.


----------



## Azrahel (6. Feb 2007)

André Uhres hat gesagt.:
			
		

> Die standard Methode "equals()" gibt nur dann "true" zurück, wenn beide Referenzen auf dasselbe Objekt zeigen.
> Das "willkürliche Bild" müsste dann also physisch ein Objekt aus dem Array sein.



*mal den Rohrstock holen geht*  :bae: Ich interpretier das als es geht, unter bestimmten Umständen... wobei ich dann eher mit == vergleichen würd  ???:L


----------



## Marco13 (6. Feb 2007)

BufferedImage a = ImageIO.load("einBild.jpg");
BufferedImage b = ImageIO.load("einBild.jpg");
BufferedImage c = a;

Hier gilt
a == c
und afaik auch
a.equals(c);
aber 
a.equals(b) 
gilt definitiv NICHT - obwohl ja "zweimal das gleiche Bild" geladen wurde. Man kann mit == (und hier: equals) nur überprüfen, ob die Referenzen gleich sind. 

Um Bilder wirklich nach dem Bild-Inhalt zu vergleichen ist mehr Arbeit nötig. Um festzustellen, dass a und b "eigentlich" das gleiche Bild sind, müsste man (im einfachsten Fall) die Bilder Pixel-Weise vergleichen.


----------



## Gast (6. Feb 2007)

Naja, weil ich hab ein Objekt in dem zwei Bilder drin sind(ist ne Spielkarte).
Ich habe 3 Karten welche verdeckt ausgeteilt werden.
Ziel ist es, die Herz-Dame aufzudecken. Und da hab ich dann ein Vergleichsobjekt angelegt. Doch vergleichen lässt es sich mit equals nicht. Im Objekt sind nur die Deckseite und das Motiv drin.
Ich hab das dann zwar mit einer getMotiv Methode gelöst(so dass die Motive und nicht die Objekte verglichen werden), aber wollte eben wissen ob die Bilder im Objekt generel nicht verlgiechbar sind.
Der Lehrer wusste auch keine Antwort darauf warum die Objekte immer als false verglichen werden, auch wenn absolut das selbe drin ist.

Und mit == ging das auch nicht wirklich. Hatte ich aus Langeweile auch probiert.

Wenn ich es nicht direkt mit equals vergleichen kann wenn ich zwei Objekte mit gleichem Inhalt erzeuge, warum geht es dann wenn ich das Objekt karte2 = karte1 setze?
Dann ist karte2 doch auch mit dem selben Inhalt ausgestattet.


----------



## Gast (6. Feb 2007)

Sry für den Doppelpost.
Kann aber als Gast ja nicht editieren 

Hab mir auch schon gedacht das man sonst Pixel für Pixel vergleichen müsste.
Zum Spass sogar ein 1x1 Pixel in das Objekt in bmp Format gelegt(dort sind ja wirklich einzeln gespeichert, oder?) und es funktionierte auch nicht.

Warum gilt dann eigentlich nicht a.equals(b)?
Ist das einfach eine "Schwäche" von Java oder hat das einen Sinn?
Mein Lehrer hat mich damit beauftragt das herauszufinden. 

Jedenfalls schon mal dake für die bisherigen Antworten


----------



## WieselAc (6. Feb 2007)

Wenn du ehe ein Objekt mit anlegst in dem du beiden Bilder (Vor und Rückseite) für jede Karte vorhälst, dann pack doch noch einen Key hinzu zB.: Zahlen 1-32 dann kriegt Karo 7 z.B. die 1 zugeordnet und wenn du zwei Objekte vergleichst prüfst du einfach die Gleichheit der Keys. 

Also weg vom Bild, hinzum Karten Objekt!


----------



## André Uhres (6. Feb 2007)

Azrahel hat gesagt.:
			
		

> .. wobei ich dann eher mit == vergleichen würd  ???:L


Object#equals:
x.equals(y) ist gleichwertig mit x == y
Aus der API Dokumentation:
for any non-null reference values x and y, this method returns true if and only if x and y 
refer to the same object (x == y has the value true).


----------



## Gast (6. Feb 2007)

Na, das Applet funktioniert soweit schon.
Mich interessiert nun der genaue Grund warum denn nun a.equals(b) wie Marco es geschrieben hat nicht gilt.


----------



## WieselAc (6. Feb 2007)

Warum a.equals(b) ist?

Weil die equals Methode nicht in der Art überschrieben wurde. Es hängt ja immer davon ab was man machen will, was man unter gleich versteht.


----------

