4 Stimmen

Java 1.4 gute Qualität Bildgrößenänderung

Wir haben eine Fotogalerie, die Servlets verwendet, um Bilder zu skalieren - wir benötigen eine gute Leistung und anständige Qualität, aber wir bekommen es einfach nicht hin. Leider haben wir auch nur Java 1.4, was uns fast keine externen Bild-Bibliotheken (fast alles was ich gefunden habe, ist Java 1.5+) und die Bildverarbeitung in Java ist wirklich nicht gut.

Wenn ich dies verwende:

private static BufferedImage scaleImage(BufferedImage orig, int type, int w, int h) {

    BufferedImage tmp = new BufferedImage(w, h, type);
    Graphics2D g2 = tmp.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

    g2.drawImage(orig, 0, 0, w, h, null);
    g2.dispose();
    return tmp;
}

sind die Ergebnisse fast immer gleich (und sehen schlecht aus) oder extrem langsam, je nach ausgewähltem Hinweis. Ich habe fast jeden Artikel über Bildskalierung in Java gelesen (einschließlich diesem hier und es hilft nicht.

Haben Sie Ideen? Irgendwelche externen Bibliotheken für Java 1.4, die schnell sind und eine anständige Qualität haben? Irgendein Algorithmus, der gute Ergebnisse liefern würde?

2voto

Thomas Punkte 84982

Sie könnten Image Magick-Wrapper wie JMagick ausprobieren.

0voto

Riyad Kalla Punkte 10424

Izk, angesichts Ihrer Anforderungen würde ich Thomas zustimmen und Sie (wahrscheinlich) müssen sich auf eine externe/native Bibliothek verlassen.

Hätten Sie die Leistung nicht explizit erwähnt, hätte ich vorgeschlagen, die BIKUBISCHE Interpolation zusammen mit Chris Campbells inkrementellem Skalierungsalgorithmus zu verwenden. Die imgscalr Bibliothek implementiert all dies, erfordert jedoch Java 5 (verwendet Enums). Trotzdem können Sie den Code leicht in eine Java-1.4-kompatible Implementierung kopieren.

Schauen Sie sich die Scalr-Klasse an, scrollen Sie ganz nach unten und kopieren Sie die letzten beiden Methoden. Das sollte alles sein, was Sie brauchen, um zu etwa 95% fertig zu werden, WENN Sie es in Java implementiert halten möchten.

Aber wenn Sie bis zu diesem Punkt die Java-Skalierungsleistung als inakzeptabel empfunden haben, wird Ihnen diese Implementierung nicht helfen. Sie müssen die Verwendung einer nativen Bibliothek wie ImageMagick in Betracht ziehen.

Zum Glück gibt es 2 beliebte Java-Bindings für ImageMagick, und wenn die JMagick-API nicht ermöglicht, mit InputStreams umzugehen, könnten Sie sich im4java ansehen, das eine direkte Wrapper-Version der Befehlszeilenversion von ImageMagick ist. Ich habe den Quellcode durchgesehen und es sieht so aus, als ob die Kern-ImageCommand-Klasse, die verwendet wird, um "Befehle" an das Befehlszeilenprogramm zu senden, es Ihnen ermöglicht, BufferedImage-Instanzen als "images" Object-Parameter zu übergeben, wenn Sie einen Vorgang ausführen.

Wenn das der Fall ist, können Sie ImageIO.read(InputStream) verwenden, um die Bilddaten in ein BufferedImage zu lesen, bevor Sie es mit der im4java-API zur Verarbeitung an ImageMagick senden.

Das sind einige Vorschläge, um Sie dorthin zu bringen, wo Sie hinmüssen. Ich hoffe, sie haben geholfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X