Frage

Ich habe ein Bild mit Java JAI skalieren. Zu der Zeit, jetzt verwende ich den folgenden Code:

private static RenderedOp scale(RenderedOp image, float scale) {
    ParameterBlock scaleParams = new ParameterBlock();
    scaleParams.addSource(image);
    scaleParams.add(scale).add(scale).add(0.0f).add(0.0f);
    scaleParams.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC_2));

    // Quality related hints when scaling the image
    RenderingHints scalingHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    scalingHints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    scalingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    scalingHints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    scalingHints.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
    scalingHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    scalingHints.put(JAI.KEY_BORDER_EXTENDER, BorderExtender.createInstance(BorderExtender.BORDER_COPY));

    return JAI.create("scale", scaleParams, scalingHints);
}

Leider führt dies zu sehr schlechte Ergebnisse, vor allem, weil ich oft maßstab Bilder mit einem Skalierungsfaktor von weniger als 0,5 ...

Jede Beratung?

War es hilfreich?

Lösung

Ich vermute, Sie versuchen, ein größeres Bild zu skalieren bis zu einer Miniaturgröße oder einen gleich großen Unterschied aus Original skalierten Bild?

Wenn lala, war dieses Thema tatsächlich Adresse von Chris Campbell von der Java2D im Jahr 2007 (ich nicht erwarte Sie dies wissen, nur darauf hinweisen, dass es sich um eine häufig gestellte Frage ist), weil die neue Java2D Skalierung Ansätze (RenderingHints.VALUE_INTERPOLATION_ * ) hatte ein Äquivalent zu den damals veraltet Image.getScaledInstance (SCALE_AREA_AVERAGING oder SCALE_SMOOTH nicht bereitstellen Ansatz).

Wie sich herausstellt, die SCALE_AREA_AVERAGING oder SCALE_SMOOTH nähert sich in dem alten Java 1.1 Image.getScaledInstance Ansatz war ein ziemlich teuer, mehrstufigen Operation, die viel Arbeit im Hintergrund zu tun war, dass gut aussehende Bild zu erzeugen.

Chris wies darauf hin, dass die neue und „richtige“ Art und Weise, mit Java2D, das gleiche Ergebnis zu erhalten, ist ein inkrementeller Prozess das Bild der Skalierung in Hälfte über und über, bis die gewünschte Größe erreicht ist, vorzugsweise ein höher- mit Qualitätsskala wie RenderHints.VALUE_INTERPOLATION_BICUBIC oder BILINEAR.

Das Ergebnis kommt fast identisch mit dem Original Image.getScaledInstance Ansatz, dass die Leute wollen.

Ich ging eigentlich für diese Antwort vor ein paar Monaten die Jagd, während ein Bild-Hosting-Schreiben Service und war überrascht, wie kompliziert die einfache Frage „Wie kann ich ein schönes Miniatur Suche in Java?“ wurde.

Ich schaffe schließlich eine kleine Java-Bibliothek (Apache 2, Open Source), dass Geräte 3 verschiedene Ansätze zur Bildskalierung in Java unter Verwendung von „Best Practices“, einschließlich der schrittweisen Vorgehens dass Chris vorgeschlagen.

Die Bibliothek heißt imgscalr . Sie können herunterladen und verwenden Sie es so einfach wie:

BufferedImage thumbnail = Scalr.resize(srcImage, 150);

Es gibt mehr Optionen zu setzen und die Nutzung (zB die Qualität oder Geschwindigkeit der Skalierung), sondern aus der Box gibt es intelligente Standardeinstellungen für alles, was ein schönes zu machen für Sie skaliert oder sehen Sie zu kümmern sich nicht um mehr, wenn Sie wollen nicht. Die Bibliothek macht auch eine starke Anstrengung zu entsorgen und jede Objektzuordnung zu vermeiden, die nicht unbedingt notwendig und entsorgen BufferedImage Fälle sofort, wenn nicht erforderlich ist - es ist beabsichtigt, Code als Teil einer langlaufende Server-Anwendung zu sein, so war dies kritisch.

Ich habe ein paar Versionen der Bibliothek bereits, und wenn Sie lieber mit ihm nur die „guten Sachen“ und etwas selbst herausreißen, denn es gehen. Es ist alles auf GitHub und nichts davon ist streng geheim, nur ein Versuch, das Leben der Menschen leichter zu machen.

Ich hoffe, das hilft.

Andere Tipps

Ich habe gute Ergebnisse mit Thumbnailator . Ich weiß nicht, was JAI.KEY_BORDER_EXTENDER tun soll, aber ich denke, den Rest der Funktionalität (Anti-Aliasing, Dithering, etc.) unterstützt wird. Ich benutzte es, Graustufen- Thumbnails von ganz großen Schwarz-Weiß-Bilder zu erzeugen

Wenn Sie Glück haben, und Sie haben nur Schwarz-Weiß-Bilder, dann können Sie sehr schnell nutzen und gute Qualität Betrieb: SubsampleBinaryToGray

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top