Gibt es eine einfache Möglichkeit zu vergleichen BufferedImage-Instanzen?
Arbeite ich an Teil einer Java-Anwendung, die nimmt ein Bild als byte-array aus, liest es in einem java.awt.image.BufferedImage
Instanz und übergibt Sie an eine Drittanbieter-Bibliothek für die Verarbeitung.
Für einen unit-test, möchte ich ein Bild (aus einer Datei auf der Festplatte) und behaupten, dass es ist, gleich dem Bild, dass bearbeitet wurde, der code.
- Meine erwartet
BufferedImage
gelesen wird aus einer PNG-Datei auf der Festplatte mithilfeImageIO.read(URL)
. - Meine test code liest die gleiche Datei in ein
BufferedImage
und schreibt, dass ein byte-array als PNG zur Verfügung zu stellen, das system under test.
Wenn das system unter test schreibt das byte-array zu einem neuen BufferedImage
ich möchte behaupten, dass die beiden Bilder gleich sind, in einer sinnvollen Art und Weise. Mit equals()
(geerbt von Object
) nicht funktioniert (natürlich). Vergleichen BufferedImage.toString()
Werte auch nicht funktioniert, da der Ausgabe-string enthält die Objekt-Referenz Informationen.
Weiß jemand irgendwelche Tastenkombinationen? Ich würde es vorziehen, nicht, um in einer Drittanbieter-Bibliothek für eine einzelne unit test in einem kleinen Teil einer großen Anwendung.
.equals()
funktioniert nicht?wenn es geerbt von Objekt, es wird nicht funktionieren, weil das tut nur Objekt-Identität.
können Sie vergleichen Sie einfach die byte-arrays (mit PNG)?
BufferedImage
nicht überschreiben Object#equals()
. docjar.com/html/api/java/awt/image/BufferedImage.java.htmlHab es, danke.
InformationsquelleAutor pharsicle | 2012-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist der beste Ansatz. Keine Notwendigkeit, eine variable zu sagen, ob das Bild immer noch gleich. Schicken Sie einfach sofort falsch wenn die Bedingung, wenn "false". Short-circuit-evaluation hilft Zeit zu sparen Schleife über die Pixel, die nach dem Vergleich schlägt fehl, wie es der Fall in trumpetlick ist Antwort.
InformationsquelleAutor Mr. Polywhirl
Wenn Geschwindigkeit ein Problem ist, und beide
BufferedImages
sind von der gleichen bit-Tiefe, Anordnung, etc. (das scheint wie es muss wahr sein hier) können Sie dies tun:herauszufinden, welche Art es ist, z.B. eine
DataBufferInt
tun, ein paar "sanity-checks" für gleich auf die Größen und die Banken von der DataBuffers, dann Schleife
Dies ist in der Nähe so schnell wie Sie bekommen können, verursachen Sie schnappen sich ein Stück der Daten zu einer Zeit, nicht nacheinander.
Denn es ist ein unit-test es scheint, wie seine test-Bild sollte die gleiche bit-Tiefe, etc. Aber mit Ihnen überein, dass in der Regel, dass ist ein bisschen eine Annahme.
dein code funktioniert nicht java.lang.Classcastexception-Fehler: java.das awt.Bild.DataBufferByte nicht cast auf java.das awt.Bild.DataBufferInt
InformationsquelleAutor user949300
Könnten Sie schreiben Ihre eigene routine für den Vergleich!
Wäre dies ein Weg!!!
if
block.Guter Punkt, Ive bearbeitet!
Auch, dass
break
Aussage nicht viel tun, Sie haben geschachteltfor
Schleifen.Jetzt ist es noch schlimmer: Sie sind weiterhin für die Iteration über die Bilder nach, die Sie bereits wissen, Sie sind nicht gleich. labelled break.
Sie brauchen nicht
imagesEqual == true
nurimagesEqual
sollte ausreichen. Das neue baby muss unter einer großen Tribut.InformationsquelleAutor trumpetlicks
Änderte ich Funktion, die gleich der durch die Pixel in Groovy, die hilfreich sein können:
InformationsquelleAutor stokito
Ich kann nicht an nichts denken, außer einer brute-force "do-Schleife":
für die "Keine Möglichkeit zu wissen, ohne zu testen!!!" ich vermute, das wird schneller als
getRGB()
pro pixel, aber die Tests werden es Sortieren.Nicht sicher, tatsächlich, er ruft "db1".getSize jeder iteration, sowie potenziell 4 Daten kopiert. 1 für die Erstellung von r1, eine für die db1, und die gleichen 2 für r2 und db2. Dann hat er auch "db1".getElem(i). Eigentlich wird in der Tat langsamer, weil er auch den Aufruf einer routine zu bekommen, beide Elemente innerhalb des arrays. db1.getSize() return (width*height) des Bildes. Er ist also nicht nur das kopieren der Daten, aber ruft die gleiche Menge von Routinen innerhalb der Schleife. Er ist auch nicht sogar die compare-operation an alle!!!
siehe meine Antwort aus einem ähnlichen Ansatz sollte schneller sein (obwohl mehr Speicher intensiv).
InformationsquelleAutor
Können Sie schreiben, dass Bild über
imageio
durch eineOutputStream
zu einembyte[]
.In meinem code sieht es mehr oder weniger so:
InformationsquelleAutor comonad
arbeiten gut, aber nicht effizient
InformationsquelleAutor cyril