Grafiken mittels Hashing vergleichen. aber wie?

Status
Nicht offen für weitere Antworten.

-Hades-

Mitglied
Hi Leute,

ich habe 2 Grafiken als BufferedImage vorliegen und möchte prüfen ob sie gleich sind (also alle Pixel denselben Farbwert haben).
Bis jetzt hab ich es so gemacht das ich alle Pixel durchgegangen bin und wenn ein Pixel gefunden wurde der sich von dem der anderen Datei an derselben Position unterschied wusste ich das sie nicht gleich sind. Da ich dazu immer "umständlich" zwei Arrays durchlaufen muss möchte ich das jetzt gerne mit Hashing machen.

Also mit
if (File1.hashcode() != File2.hashcode()) {return false;}
geht es nicht da der hashwert in dem Fall nicht nur aus dem Inhalt der Grafiken berechnet wird (anscheinend).

Falls jemand eine Lösung hat wäre ich sehr dankbar!

Gruß Dominik
 

Wildcard

Top Contributor
pixel für pixel. anders kriegst du's nicht hin.
Sinnvoll ist's aber erstmal die Bildgröße auf Gleichheit zu testen.
 

-Hades-

Mitglied
wow, eine so schnelle Antwort :toll:

nur leider genau die die ich nicht hören wollte :(

Hmm also ich weiß das es in VB.net ohne Probleme geht, irgendjemand meinte mal das man dazu irgendein System.security oder so benutzen muss und das normale hashing für datenstrukturen nicht funktioniert (diese Aussage ist mit Vorsicht zu genießen da sie nur sehr bruchstückhaft in meinem Kopf rumschwirrt aber das es klappt weiß ich ziemlich sicher).

Also wenn es wirklich nicht gehen sollte, könnte mir das noch jemand bestätigen, dann kann ich aufhören danach zu suchen aber ich bin noch nicht ganz davon überzeugt, bis jetzt.

Also an alle Experten, wenn es eine Lösung gibt bitte posten.

Falls jemand das das Thema hier nicht reinpasst bitte ich um Entschuldigung aber ich wusste es nicht besser, es handelt sich ja auch um Grafiken deren Inhal ich vergleichen möchte :cool:

Gruß Dominik

Asooo, noch was am Rande, die Bildgröße is eh immer gleich bei den Vergleichen.
 

Wildcard

Top Contributor
Sofern du gewisse Annahmen für die Bilder treffen kannst gibt es effizientere Verfahren.
Sag mal ein paar Worte dazu was du genau vor hast.
 

-Hades-

Mitglied
Hmm okay, ich hätte es vielleicht gleich etwas präzisieren sollen.

Ich habe kleine gif-Dateien (50x50 Pixel) vorliegen und lasse von meinem Programm in gewissen Abständen einen Screenshot machen um zu gucken ob ein bestimmter Fall (den ich durch Bildvergleich ermitteln möchte) eingetreten ist. Die vorliegende Grafikdatei lasse ich als BufferedImage einlesen und lese auch den (frisch) gemachten Screenshot als BufferedImage ein. Die beiden gleichgroßen BufferedImages möchte ich dann wie gesagt auf Gleichheit vergleichen.

Es müssen also zwingend alle Pixel exakt gleich sein damit ich genaue Aussagen machen kann.

Das sollte zu den Rahmenbedingungen genügen denke ich.
 

Wildcard

Top Contributor
Da bei einem Hashwert grundsätzlich Kollisionen auftreten können müssteste du bei identischen Hashwerten trotzdem alle Pixel vergleichen, ein Hashwert würde also nur der Vorsortierung dienen.
Das Problem ist aber das ein Hashwert natürlich auch den gesamten Inhalt der Daten anfassen muss, daher stellt sich die Frage in wie weit das überhaupt schneller als ein Pixelvergleich ist.
Falls du die Dateien eh rauspeichern musst würde sich zum Beispiel ein Vergleich der Dateigröße als Vorauswahl eignen.
 

-Hades-

Mitglied
Hmm verdammt das macht alles schon ziemlich Sinn was du sagst!
Das mit den Kollisionen und das zwei unterschiedliche Objekte auf denselben Hashwert abgebildet werden können is wohl das Hauptproblem. Das das ganze nicht wirklich schneller sein (ich denke mein Code is recht optimiert) is auch klar... wahrscheinlich wollte ich nur ne Lösung mit der ich die 5 Zeilen Code mit den Arrays durch nur eine mit dem Hashing ersetzen kann :roll:

Aber du scheinst zu wissen das es doch geht und auch wie, wenn du Lust hast könntest du das bitte trotzdem posten? Jetzt interessierts mich doch, auch wenn ich meine Implementierung wohl bestehen lasse.

Gruß Dominik
 

Wildcard

Top Contributor
Naja, wenn ich's jetzt machen müsste und kein Array benutzen dürfte würde ich mir wohl von beiden BufferdImages das ColorModel geben lassen und dann nachsehen ob in der konkreten Implementierung equals sinnvoll überschrieben ist... ???:L
 

-Hades-

Mitglied
Hmm okay, das is für mich noch zu hoch, bin noch nicht lange bei der Programmierung mit Java, ich habe equals() gar nicht überschrieben da ich mich damit nicht auskenne. Auf jeden Danke für deine schnellen Antworten Wildcard!!
 

Wildcard

Top Contributor
Nein, du musst gar nichts überschrieben.
Lass dir nur mal von deinem BufferedImage das ColorModel geben und schau dir an welche konkrete Instanz verwendet wird.
Sobald das geklärt ist kann man im Source dieser Klasse nachsehen ob dort equals überschrieben ist, und wenn ja, wie.
 

-Hades-

Mitglied
Ok, also ColorModel() ist in der Klasse Java.awt.image.BufferedImage zu finden. Ich hab aber irgendwie die Befürchtung das es nicht das ist was du hören willst, wie finde ich heraus welche konkrete Instanz benutzt wird?
 

Wildcard

Top Contributor
Es gibt verschiedene ColorModels. Welches konkret verwendet wird kann man am einfachsten zur Laufzeit rausfinden.
Code:
System.println(bufferedImage.getColorModel().getClass().getName());
 

Wildcard

Top Contributor
Läuft wohl auf das Gleiche raus:
Code:
  public boolean equals(Object obj) {
        if (!(obj instanceof ColorModel)) {
            return false;
        }
        ColorModel cm = (ColorModel) obj;
        
        if (this == cm) {
            return true;
        }
        if (supportsAlpha != cm.hasAlpha() ||
            isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
            pixel_bits != cm.getPixelSize() ||
            transparency != cm.getTransparency() ||
            numComponents != cm.getNumComponents())
        {
            return false;
        }

        int[] nb = cm.getComponentSize();

        if ((nBits != null) && (nb != null)) {
            for (int i = 0; i < numComponents; i++) {
                if (nBits[i] != nb[i]) {
                    return false;
                }
            }
        } else {
            return ((nBits == null) && (nb == null));
        }

        return true;
    }
Die Methode ist allerdings von ColorModel, da sie in IndexColorModel nicht neu überschrieben wird.
Ich würde das einfach so benutzen, dann hast du's zumindest aus deinem Code raus.
 

HaBaLeS

Aktives Mitglied
Gu solltest aber auch testen, ob die Gif´s die du als Referenz einliest die gleiche Instanz des Color Models benutzen.

Deine Ursprüngliche Idee die Bilder Mittels Hash zu überprüfen, könntest du mal mit einem MD5 Hasch probieren, aber ich bezweifle ein bisschen, das du damit erfolg haben wirst, da die Headerdaten der Bilder wahrscheinlich nicht gleich sind. Bei RAW Images könnte es klappen.

Generell ist hierfür gerade ein GIF als quelle eher ungeeignet, da es mit Paletten arbeitet. Wenn du einen Screenshot machst kann es gut sein, das du eine ganz andere Palette hast als im Originalbild und das macht das vergleichen sehr schwer. Versuch´s doch mal mit BMP´s

Grüße
 

-Hades-

Mitglied
Ok, ich kann gerne mit bmp´s arbeiten aber ich denke das die Bilder im Aufbau gleich sind, da ich die schon vorliegenden Grafiken, die als Referenz dienen mit demselben Programm erzeugt habe.

Wie läuft das denn genau mit dem MD5 hash?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Grafiken in JLabel mittels html AWT, Swing, JavaFX & SWT 5
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
T Wie kann man in java aufwendige grafiken programmieren AWT, Swing, JavaFX & SWT 1
SchmidiMC 2D-Grafik Grafiken werden nicht gezeichnet AWT, Swing, JavaFX & SWT 2
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Überdeckung von Grafiken AWT, Swing, JavaFX & SWT 1
A Array von JLabel mit Grafiken anzeigen AWT, Swing, JavaFX & SWT 3
J Diverse Grafiken in JPanel anzeigen und zoomen AWT, Swing, JavaFX & SWT 3
D Grafiken an Maus anhängen AWT, Swing, JavaFX & SWT 2
G Welcher Teil der Java Standard Edition API ist für das Zeichnen von einfachen Grafiken gedacht? AWT, Swing, JavaFX & SWT 3
Luk10 2D Grafiken in Java AWT, Swing, JavaFX & SWT 3
T Auswahl in GUI-Builder mit Grafiken ausstatten AWT, Swing, JavaFX & SWT 4
B Java Grafiken an bestimmter Positon des Panels anzeigen AWT, Swing, JavaFX & SWT 6
D Wie mehrere Grafiken auf JPanel anzeigen lassen? (Observer pattern?) AWT, Swing, JavaFX & SWT 24
G Label auf Panel auf Panel mit Grafiken als Hintergrund (awt) AWT, Swing, JavaFX & SWT 7
D JScrollPane mit Grafiken scrollen lassen AWT, Swing, JavaFX & SWT 2
A Überlagernde Grafiken AWT, Swing, JavaFX & SWT 5
H grafiken aus bestimmtem ordner anzeigen AWT, Swing, JavaFX & SWT 8
S Wie verhalten sich transparente Grafiken? AWT, Swing, JavaFX & SWT 5
K Grafiken werden nicht richtig angezeigt. AWT, Swing, JavaFX & SWT 2
A Wo sind die Grafiken für JTree ? AWT, Swing, JavaFX & SWT 3
N in Frame Grafiken zeichnen und gleichz. Buttons haben? AWT, Swing, JavaFX & SWT 2
G Grafiken in Buttons AWT, Swing, JavaFX & SWT 6
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
P JavaFx - Progressbar - Füllen mittels mehreren Tasks AWT, Swing, JavaFX & SWT 0
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
JavaMachtMichFertig JavaFX Gui - Löschbutton in Tabelle anzeigen, die mittels MySQL Abfrage gefüllt wird AWT, Swing, JavaFX & SWT 5
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
L Ausgabe in JEditorPane mittels HTMLEditorKit zeigt auf bestimmten Systemen falsche Zeichen AWT, Swing, JavaFX & SWT 1
J Swing GUI-Einstellungen mittels Preferences AWT, Swing, JavaFX & SWT 2
J Rechtecke mittels getWidth AWT, Swing, JavaFX & SWT 1
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
T JFrame mittels Shortcut anzeigen AWT, Swing, JavaFX & SWT 2
E Client-Server mittels AWT AWT, Swing, JavaFX & SWT 27
A Swing Fenstergröße mittels Menü verändern AWT, Swing, JavaFX & SWT 3
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
R Swing Verschieben eines jButtons mittels MouseDragged AWT, Swing, JavaFX & SWT 4
N Wertanzeige mittels JSpinner AWT, Swing, JavaFX & SWT 3
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
Z Swing Mittels GUI Werte aus Property-File ändern AWT, Swing, JavaFX & SWT 5
C Swing Eine SWING-Anwendung mittels MVC AWT, Swing, JavaFX & SWT 4
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
T HTML Seite neu laden mittels Applet AWT, Swing, JavaFX & SWT 2
G Zentrieren mittels setLocationRelativeTo(null);? AWT, Swing, JavaFX & SWT 14
Semox Setzen des Layout Managers mittels Override Parameter AWT, Swing, JavaFX & SWT 10
T JTable-Zelle mittels JFileChooser befüllen AWT, Swing, JavaFX & SWT 5
F JTextArea mittels Tab verlassen. AnyIdea? AWT, Swing, JavaFX & SWT 2
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
F Größenänderung mittels Maus - selbst implementieren? AWT, Swing, JavaFX & SWT 3
G Jtable mittels Liste füllen AWT, Swing, JavaFX & SWT 3
F Einlesen von text in textArea mittels for-schleife AWT, Swing, JavaFX & SWT 3
M JComboBox - Mittels FocusListener Event auslösen? AWT, Swing, JavaFX & SWT 4
B Vektorgrafik mittels Batik Tool anzeigen AWT, Swing, JavaFX & SWT 3
L Internationalisierung mittels ResourceBundle und Menu HotKey AWT, Swing, JavaFX & SWT 6
M Fenstertiteländerung mittels WindowAdapter AWT, Swing, JavaFX & SWT 5
H MouseEvent bei Drag & Drop (mittels TransferHandler) AWT, Swing, JavaFX & SWT 3
L Daten mittels ObjectInputStream ins JTable AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben