BufferedImages vergleichen

Nasdneb

Mitglied
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!!
 
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.
 
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.
 
Klappt alles ganz wunderbar. So sieht meine equals Methode aus:

Java:
	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;

	}
 
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.
 
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 ...
 

Neue Themen


Zurück
Oben