Hallo zusammen,
suche seit längerem eine Möglichkeit, grosse Jpeg-Dateien (5-8MB) performant zu skalieren. Ohne Interpolation klappt es mit Graphics2D.drawImage() ganz gut, aber mit Interpolation dauert es zwischen zwei und vier Minuten. So sieht mein Code aus:
[highlight=Java]
public BufferedImage createScaledBufferedImage(BufferedImage originalImage, String type, boolean useInterpolation)
{
// ---- Anfang Ausschnitt
BufferedImage bi;
Graphics2D g2;
bi = createCompatibleImage(thumbnailWidth,thumbnailHeight,BufferedImage.TYPE_INT_RGB);
g2 = bi.createGraphics();
if(useInterpolation)
{
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
}
g2.drawImage(originalImage, 0, 0, thumbnailWidth, thumbnailHeight, null);
g2.dispose();
return bi;
// ---- Ende Ausschnitt
}
private BufferedImage createCompatibleImage(int width, int height, int type) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(width, height, type);
return image;
}
[/highlight]
Wenn useInterpolation == false, dann geht das Ganze ziemlich fix, aber mit den RenderingHints.VALUE_INTERPOLATION_BILINEAR wird das Warten zur Geduldsprobe. Mein Entwicklunsrechner: WinXP, Centrino Duo 1.83 GHz, 2 GB RAM.
Hat jemand eine Idee, wie dies performanter gemacht werden könnte? Habe die Hardware-Beschleuniging über System.setProperty("sun.java2d.ddscale", "true"); eingeschaltet, ohne spürbare Verbesserungen. Oder ist drawImage() einfach so langsam? Zugegeben, die Files sind ziemlich gross...
Wenn es hier keinen besseren Weg gibt, muss ich vielleicht doch auf native Bibliotheken, wie z.B. ImageMagick, zurückgreifen.
Viele Grüsse,
Ulf
suche seit längerem eine Möglichkeit, grosse Jpeg-Dateien (5-8MB) performant zu skalieren. Ohne Interpolation klappt es mit Graphics2D.drawImage() ganz gut, aber mit Interpolation dauert es zwischen zwei und vier Minuten. So sieht mein Code aus:
[highlight=Java]
public BufferedImage createScaledBufferedImage(BufferedImage originalImage, String type, boolean useInterpolation)
{
// ---- Anfang Ausschnitt
BufferedImage bi;
Graphics2D g2;
bi = createCompatibleImage(thumbnailWidth,thumbnailHeight,BufferedImage.TYPE_INT_RGB);
g2 = bi.createGraphics();
if(useInterpolation)
{
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
}
g2.drawImage(originalImage, 0, 0, thumbnailWidth, thumbnailHeight, null);
g2.dispose();
return bi;
// ---- Ende Ausschnitt
}
private BufferedImage createCompatibleImage(int width, int height, int type) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(width, height, type);
return image;
}
[/highlight]
Wenn useInterpolation == false, dann geht das Ganze ziemlich fix, aber mit den RenderingHints.VALUE_INTERPOLATION_BILINEAR wird das Warten zur Geduldsprobe. Mein Entwicklunsrechner: WinXP, Centrino Duo 1.83 GHz, 2 GB RAM.
Hat jemand eine Idee, wie dies performanter gemacht werden könnte? Habe die Hardware-Beschleuniging über System.setProperty("sun.java2d.ddscale", "true"); eingeschaltet, ohne spürbare Verbesserungen. Oder ist drawImage() einfach so langsam? Zugegeben, die Files sind ziemlich gross...
Wenn es hier keinen besseren Weg gibt, muss ich vielleicht doch auf native Bibliotheken, wie z.B. ImageMagick, zurückgreifen.
Viele Grüsse,
Ulf
Zuletzt bearbeitet: