Discussion:
Java ImageIO; mal lahm, mal flott
(zu alt für eine Antwort)
Peter
2016-01-15 19:08:13 UTC
Permalink
Hallo,

hier habe ich eine große Menge jpeg-Images (ca. 3k), von denen ich für
die Weiterverarbeitung ihre Größe benötige.
Der Helfer in allen Lebenslagen heißt stackoverflow, und da findet sich
folgende viel versprechende Lösung:

http://stackoverflow.com/questions/672916/how-to-get-image-height-and-width-using-java

"Here is something very simple and handy.

BufferedImage bimg = ImageIO.read(new File(filename));
int width = bimg.getWidth();
int height = bimg.getHeight();"

Funktioniert tatsächlich; hat nur einen schweren Nachteil:
Diese "Löschung" dauert eeeeeehhhhhhhhwig!
Ca. 10 Sekunden für ein Image!

Ich habe nämlich nicht nur viele Images, sie sind auch recht groß (8k x
8k); insgesamt ca. 50GB.

Wiedermal eine OO-Sternstunde: Es wird ein 10 Tonnen schweres Objekt
instanziiert, nur um es dann nach seine Größe zu fragen :-(

Aber wenn man bei obiger Website etwas nach unten scrollt, findet man
noch einen Vorschlag:

/**
* Gets image dimensions for given file
* @param imgFile image file
* @return dimensions of image
* @throws IOException if the file is not a known image
*/
public static Dimension getImageDimension(File imgFile) throws IOException {
int pos = imgFile.getName().lastIndexOf(".");
if (pos == -1)
throw new IOException("No extension for file: " +
imgFile.getAbsolutePath());
String suffix = imgFile.getName().substring(pos + 1);
Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
if (iter.hasNext()) {
ImageReader reader = iter.next();
try {
ImageInputStream stream = new FileImageInputStream(imgFile);
reader.setInput(stream);
int width = reader.getWidth(reader.getMinIndex());
int height = reader.getHeight(reader.getMinIndex());
return new Dimension(width, height);
} catch (IOException e) {
log.warn("Error reading: " + imgFile.getAbsolutePath(), e);
} finally {
reader.dispose();
}
}

throw new IOException("Not a known image file: " +
imgFile.getAbsolutePath());
}

Und siehe da, alles flutscht quasi in Nullzeit.

Noch weiter unten hat sich jemand gefunden, der die Performanz der
verschiedenen Ansätze miteinander verglichen hat; da lernt man, dass die
durchaus um den Faktor 200(!) auseinander liegen.

Vielleicht ist das auch der Grund, warum der Geoserver so grottenlahm ist...
Thomas Richter
2016-01-21 09:40:38 UTC
Permalink
Post by Peter
Hallo,
"Here is something very simple and handy.
BufferedImage bimg = ImageIO.read(new File(filename));
int width = bimg.getWidth();
int height = bimg.getHeight();"
Diese "Löschung" dauert eeeeeehhhhhhhhwig!
Ca. 10 Sekunden für ein Image!
Ich habe nämlich nicht nur viele Images, sie sind auch recht groß (8k x
8k); insgesamt ca. 50GB.
Wiedermal eine OO-Sternstunde: Es wird ein 10 Tonnen schweres Objekt
instanziiert, nur um es dann nach seine Größe zu fragen :-(
Aber wenn man bei obiger Website etwas nach unten scrollt, findet man
/**
* Gets image dimensions for given file
*/
public static Dimension getImageDimension(File imgFile) throws IOException {
int pos = imgFile.getName().lastIndexOf(".");
if (pos == -1)
throw new IOException("No extension for file: " +
imgFile.getAbsolutePath());
String suffix = imgFile.getName().substring(pos + 1);
Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
if (iter.hasNext()) {
ImageReader reader = iter.next();
try {
ImageInputStream stream = new FileImageInputStream(imgFile);
reader.setInput(stream);
int width = reader.getWidth(reader.getMinIndex());
int height = reader.getHeight(reader.getMinIndex());
return new Dimension(width, height);
} catch (IOException e) {
log.warn("Error reading: " + imgFile.getAbsolutePath(), e);
} finally {
reader.dispose();
}
}
throw new IOException("Not a known image file: " +
imgFile.getAbsolutePath());
}
Und siehe da, alles flutscht quasi in Nullzeit.
Der Unterschied zwischen beiden Lösungen ist, dass die erstere Lösung
das Bild vollständig decodiert, während die zweite nur den Header
abfragt. Kann man, sofern JPEG gesetzt ist, auch problemlos "von Hand"
erledigen. Die Bildgröße steht im SOF-Marker, der im Binärstrom durch
die Bytefolge 0xff 0xc0 gekennzeichnet ist. Einfach da rausziehen und
gut ist...

Grüße,
Thomas

Lesen Sie weiter auf narkive:
Suchergebnisse für 'Java ImageIO; mal lahm, mal flott' (Newsgroups und Mailinglisten)
71
Antworten
Erfahrungen mit DynDNS
gestartet 2009-04-20 21:45:58 UTC
de.comp.sys.mac.misc
13
Antworten
Image -> byte array
gestartet 2005-09-19 16:05:23 UTC
de.comp.lang.java
Suchergebnisse für 'Java ImageIO; mal lahm, mal flott' (Fragen und Antworten)
14
Antworten
Wie kann ich die Uhrzeit auf meinem Smartphone überprüfen, ohne selbst wichtig zu wirken?
gestartet 2018-06-05 08:07:50 UTC
zwischenmenschlich
14
Antworten
Wie gehe ich mit einem unterdurchschnittlichen Untergebenen um?
gestartet 2019-02-22 20:50:35 UTC
arbeit
11
Antworten
Wie kann man in einem Interview auf zu spezifische technische Fragen antworten?
gestartet 2013-04-03 00:01:23 UTC
arbeit
19
Antworten
Wie kann ein Mitarbeiter daran gehindert werden, das Unternehmen als Geisel zu nehmen?
gestartet 2018-06-04 01:55:05 UTC
arbeit
13
Antworten
Sollte ich Fähigkeiten in meinem Lebenslauf auflisten, wenn ich kein Interesse daran habe, sie erneut zu verwenden?
gestartet 2014-02-24 23:30:55 UTC
arbeit
Nicht verwandte, aber interessante Themen
5
Antworten
Wie kann ich Reflexionen beim Fotografieren in Schaufenstern vermeiden?
gestartet 2011-12-19 23:49:29 UTC
5
Antworten
Kann ich über die Audioausgangsbuchse eines PCs einen 2,5-mm-Auslöser auslösen?
gestartet 2017-02-28 15:14:07 UTC
7
Antworten
Was ist der Unterschied zwischen P-Modus und Av oder Tv?
gestartet 2014-01-28 16:58:07 UTC
5
Antworten
Täuschen die Bildstabilisierungswerte der Hersteller für Zoomobjektive?
gestartet 2011-08-11 11:13:13 UTC
5
Antworten
Ein Fotoeffekt, der Gelb & Blau bevorzugt; Wie heißt es und wie wird es mit GIMP gemacht?
gestartet 2016-11-10 15:05:32 UTC
Loading...