Hey.
Ich hab grad ein komisches Problem und weiß nicht woran es liegt. Ich hab gegoogled wie man am besten Bilder vergleicht, da wurde mir geraten mit dem RBG-Wert eines BufferedImages Pixel für Pixel die Bilder zu vergleichen. So das habe ich versucht umzusetzen (Statusmeldungen, also sout
habe ich mal dringelassen)
Erstmal die Methode:
[spoiler]
if (first == null || !first.toFile().isDirectory() || second == null || !second.toFile().isDirectory()) {
throw new NoDirectoryException("Die Pfade müssen Ordner sein!");
}
long time = System.nanoTime();
long time2 = System.currentTimeMillis();
long ungleich = 0, for1 = 0, for2 = 0, for3 = 0, for4 = 0, for5 = 0, for6 = 0;
File fp = first.toFile();
File fo = second.toFile();
File[] a = fp.listFiles();
File[] b = fo.listFiles();
for (File f : a) {
for1++;
for (File d : b) {
for2++;
ImageIcon icon = new ImageIcon(f.toURI().toURL());
ImageIcon icon2 = new ImageIcon(d.toURI().toURL());
if (!f.isDirectory() && !d.isDirectory()) {
BufferedImage image1 = new BufferedImage(icon.getIconHeight(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB);
BufferedImage image2 = new BufferedImage(icon2.getIconHeight(), icon2.getIconHeight(), BufferedImage.TYPE_INT_RGB);
int iHeight = 0, iWidth = 0, uHeight = 0, uWidth = 0;
for (; iHeight != image1.getHeight(); iHeight++) {
for3++;
for (; iWidth != image1.getWidth(); iWidth++) {
for4++;
for (; uHeight != image2.getHeight(); uHeight++) {
for5++;
for (; uWidth != image2.getWidth(); uWidth++) {
for6++;
if (image1.getRGB(iHeight, iWidth) != image2.getRGB(uWidth, uWidth)) {
ungleich++;
}
}
}
}
}
}
}
}
long after = System.nanoTime();
long after2 = System.currentTimeMillis();
long dauer = after - time;
long dauer2 = after2 - time2;
DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
DecimalFormat de = new DecimalFormat();
df.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("For1: " + de.format(for1));
System.out.println("For2: " + de.format(for2));
System.out.println("For3: " + de.format(for3));
System.out.println("For4: " + de.format(for4));
System.out.println("For5: " + de.format(for5));
System.out.println("For6: " + de.format(for6));
System.out.println("Ungleiche: " + ungleich);
System.out.println("Dauer in Nanos: " + de.format(dauer) + "; Formatiert: " + df.format(dauer));
System.out.println("Dauer in Millis: " + de.format(dauer2) + "; Formatiert: " + df.format(dauer2));
return ungleich;
}```
[/spoiler]
Ohne die Ausgaben:
```private static int compareImageDirectories(Path first, Path second) throws MalformedURLException, NoDirectoryException {
File fp = first.toFile();
File fo = second.toFile();
File[] b = fp.listFiles();
File[] a = fo.listFiles();
int ungleich = 0;
for (File f : a) {
for (File d : b) {
ImageIcon icon = new ImageIcon(f.toURI().toURL());
ImageIcon icon2 = new ImageIcon(d.toURI().toURL());
if (!f.isDirectory() && !d.isDirectory()) {
BufferedImage image1 = new BufferedImage(icon.getIconHeight(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB);
BufferedImage image2 = new BufferedImage(icon2.getIconHeight(), icon2.getIconHeight(), BufferedImage.TYPE_INT_RGB);
int iHeight = 0, iWidth = 0, uHeight = 0, uWidth = 0;
for (; iHeight != image1.getHeight(); iHeight++) {
for (; iWidth != image1.getWidth(); iWidth++) {
for (; uHeight != image2.getHeight(); uHeight++) {
for (; uWidth != image2.getWidth(); uWidth++) {
if (image1.getRGB(iHeight, iWidth) != image2.getRGB(uWidth, uWidth)) {
ungleich++;
}
}
}
}
}
}
}
}
return ungleich;
}```
Die Ausgabe bei meinen beiden Testordnern war:
For1: 82
For2: 6.478
For3: 4.530.006
For4: 4.530.006
For5: 4.791.717
For6: 4.791.717
Ungleiche: 0
Dauer in Nanos: 8.016.962.697; Formatiert: 18:56:02
Dauer in Millis: 8.017; Formatiert: 00:00:08
Im ersten Ordner sind 82 Dateien, im 2. 79. Hab dabei mal die Pfadangaben umgedreht, dabei hat sich auch nur die erste Ausgabe in die Menge des anderen Ordners geändert, das passt also.
Aber wieso ist die 3. + 4. Ausgabe, sowie die 5. + 6. Ausgabe immer gleich? Dazu werden 0 ungleiche Bilder gefunden, obwohl einige Bilder nicht in beiden sind und einige auch nur einen Ausschnitt eines anderen sind.
Also wieso findet er keine ungleichen Bilder?
Bzw. wieso wird `if (image1.getRGB(iHeight, iWidth) != image2.getRGB(uWidth, uWidth)) {` nie true? Die Abfrage wird ja ausgeführt, aber anscheinend sind immer alle gleich... ich denk jetz schon ca 30min drüber nach und komm nicht drauf.