Hallo ihr Lieben.
Ich bin gerade dabei mit Hilfe einer Library einen einfachen Bilder-Ähnlichkeits Berechner zu proggen.
Hierfür habe ich Bilder in unterschiedlichen Formaten.
Falls ich:
mache, werden wohl automatisch TYPE_3BYTE_BGR oder TYPE_BYTE_GRAY verwendet.
Allerdings habe ich auch eine kleine Zeichnungskomponente in dem man ein Bild laden und eben auch verändert werden kann. Hierbei habe ich TYPE_INT_ARGB verwendet, da ich aus verschiedenen Gründen auch einen Alpha Wert brauche und normalerweise halt auch sonst standardmäßig immer irgendwie TYPE_INT_RGB nehme. Ehrlich gesagt hab ich mir über die typen bei einem BufferedImage nie Gedanken gemacht.
Das Problem ist nun folgendes:
Ich habe Features (ColorHistogram) auf mehrere Bilder berechnet (die durch JavaIO.read(file) automatisch zu TYPE_3BYTE_BGR oder TYPE_BYTE_GRAY) wurden. Diese werden mit einem Bild dessen Feature in TYPE_INT_RGB berechnet wurden und das führt dazu, dass andere Bilder als ähnlicher gehalten werden wie das "identische", das sich auch in den vorberechenten Features befindet.
Folglich schließe ich daraus, dass ich alle Feature Berechnungen wohl auf den gleichen Typ machen sollte. Deshalb wandle ich halt jetzt alle BufferedImages vor der Feature-Berechnung um, wenn sie einen anderen TYP haben:
Meine Fragen:
1.) Gäbe es für mich einen alternativen Weg?
2.) Da ich mich überhaupt nicht mit den BufferedImage Typen auskenne. Gibt es irgendwo eine Anleitung was man wann verwenden soll? In den meisten Beispielen wird ja immer BufferedImage.TYPE_INT_RGB verwendet.
3.) Kann auch ein Bild gleich in TYPE_INT_RGB geladen werden? Anstelle ImageIO.read() entscheiden zu lassen und es dann von Hand um zu wandeln?
Ich bin gerade dabei mit Hilfe einer Library einen einfachen Bilder-Ähnlichkeits Berechner zu proggen.
Hierfür habe ich Bilder in unterschiedlichen Formaten.
Falls ich:
Java:
BufferedImage b = ImageIO.read(file);
System.out.println(b.getType());
mache, werden wohl automatisch TYPE_3BYTE_BGR oder TYPE_BYTE_GRAY verwendet.
Allerdings habe ich auch eine kleine Zeichnungskomponente in dem man ein Bild laden und eben auch verändert werden kann. Hierbei habe ich TYPE_INT_ARGB verwendet, da ich aus verschiedenen Gründen auch einen Alpha Wert brauche und normalerweise halt auch sonst standardmäßig immer irgendwie TYPE_INT_RGB nehme. Ehrlich gesagt hab ich mir über die typen bei einem BufferedImage nie Gedanken gemacht.
Das Problem ist nun folgendes:
Ich habe Features (ColorHistogram) auf mehrere Bilder berechnet (die durch JavaIO.read(file) automatisch zu TYPE_3BYTE_BGR oder TYPE_BYTE_GRAY) wurden. Diese werden mit einem Bild dessen Feature in TYPE_INT_RGB berechnet wurden und das führt dazu, dass andere Bilder als ähnlicher gehalten werden wie das "identische", das sich auch in den vorberechenten Features befindet.
Folglich schließe ich daraus, dass ich alle Feature Berechnungen wohl auf den gleichen Typ machen sollte. Deshalb wandle ich halt jetzt alle BufferedImages vor der Feature-Berechnung um, wenn sie einen anderen TYP haben:
Java:
public static BufferedImage getTransferedBufferedImage(BufferedImage start) {
if (start.getType() == BufferedImage.TYPE_INT_RGB) {
return start;
} else {
BufferedImage result = new BufferedImage(start.getWidth(), start.getHeight(), BufferedImage.TYPE_INT_RGB);
result.getGraphics().drawImage(start,0,0,null);
return result;
}
}
Meine Fragen:
1.) Gäbe es für mich einen alternativen Weg?
2.) Da ich mich überhaupt nicht mit den BufferedImage Typen auskenne. Gibt es irgendwo eine Anleitung was man wann verwenden soll? In den meisten Beispielen wird ja immer BufferedImage.TYPE_INT_RGB verwendet.
3.) Kann auch ein Bild gleich in TYPE_INT_RGB geladen werden? Anstelle ImageIO.read() entscheiden zu lassen und es dann von Hand um zu wandeln?