# BufferedImages vergleichen



## Nasdneb (24. Jun 2010)

Servus Programmierer!

In meiner Software erzeuge ich BufferedImages aus 4 Teil-BufferedImages und speichere diese in einer ArrayList. Jetzt will ich allerdings verhindern, dass zwei identische, also Bilder mit denselben Pixeln abgespeichert werden. Weiß einer von euch wie das zu bewerkstelligen ist? Danke!!


----------



## Gast2 (24. Jun 2010)

Das einfachste wäre sicherlich ne eigene BufferedImage Klasse zu schreiben die dann equals überschreibt.
Hier könntest du dann zuerst prüfen ob die Bilder die selben Dimensionen haben und anschließend Pixel für Pixel auf Gleichheit prüfen.

Je nach Beschaffenheit der Bilder und wie oft du das prüfen willst kann das ganze dann schon etwas dauern, ich würds aber einfach mal testen.


----------



## Nasdneb (24. Jun 2010)

Ok so habe ich mir das auch schon überlegt. Wie kann man denn die Pixel vergleichen?


----------



## Gast2 (24. Jun 2010)

Du kannst dir den RGB Wert per getRGB(x, y); auslesen.


----------



## Marco13 (24. Jun 2010)

Ob man da wirklich eine eigene Klasse machen sollte, weiß ich nicht. Einerseits ist es wohl mit Abstand die einfachste Lösung, andererseits legt man sich auf den Typ fest. Vererbung kann schrecklich unflexibel sein.

Wenn man das aber macht und equals überschreibt, muss man ohnehin auch hashCode überschreiben. Wenn man davon ausgehen KÖNNTE, dass die Bilder nicht veränderbar sind, könnte man den HashCode im Konstruktor (oder sonstwo nur EINmal) berechnen, und beim equals-Vergleich dann zumindest sowas machen wie
if (this.precomputedHashCode != other.precomputedHashCode) return false;

Aber vermutlich kann man das nicht.


----------



## Nasdneb (25. Jun 2010)

Klappt alles ganz wunderbar. So sieht meine equals Methode aus:


```
public boolean equals(Object o){
		if(o instanceof ComparedImage){
			ComparedImage img = (ComparedImage) o;
			boolean equal = true;
			for(int width = 0; width < img.getWidth(); width++)
			for(int height = 0; height < img.getWidth(); height++){
				if(img.getRGB(width, height) != this.getRGB(width, height)){
					equal = false;
				}
			}
			return equal;
		}
		return false;

	}
```


----------



## Gast2 (25. Jun 2010)

Falls deine Bilder unterschiedliche Dimensionen haben können würde ich vorher noch die Dimensionen prüfen.
Ansonsten solltest du überlegen so wie Marco13 vorzugehen, das kann dir ne menge zeit sparen wenn du Bilder öfter miteinander vergleichen willst.


----------



## Marco13 (25. Jun 2010)

Das Problem ist, dass man vermutlich nicht davon ausgehen kann, dass das Bild sich nicht mehr ändert.

Aber die Abfrage bzw. Überprüfung der Größe könnte (je nach Anwendungsfall) auch schon SEHR viel Geschwindigkeitsvorteil bringen (eben wenn sie unterschiedlich groß sind   ).

Diese Größenüberprüfung ist aber aber keine optionale Sache: Man *MUSS* die Größe überprüfen, sonst haut's ihn beim Vergleich ungleichgroßer Bilder mit einer ... IrgendwasOutOfBoundsException oder so raus ...


----------

