Ich bin ein einigermaßen erfahrener Java-Programmierer, aber relativ neu in Java2D. Ich versuche ein Bild zu skalieren, bekomme aber schlechte Qualitätsergebnisse. Das Bild ist eine Vorschau eines Panels und enthält so Dinge wie Text und Textfelder. Ich werde immer runter, niemals nach oben.
Momentan verwende ich den folgenden Code: -
%Vor%Where panelImage ist die Vorschau in voller Größe (BufferedImage) und scaledWidth und scaledHeight sind die jeweiligen Zieldimensionen. Ich scheine eine Menge Details in Text und Kanten von Dingen wie Textfeldern usw. zu verlieren.
Gibt es einen besseren Anruf, den ich verwenden sollte, um das Bild zu skalieren?
Danke, John
Ein Vorschlag, den ich machen kann, besteht darin, zuerst das Bild auf ein separates BufferedImage
. Der Grund dafür ist ein Graphics2D
Objekt von BufferedImage
kann erhalten werden, um ein besseres skaliertes Bild zu erzeugen.
Graphics2D
kann "Rendering-Hinweise" akzeptieren, die angeben, wie die Bildverarbeitung vom Objekt Graphics2D
ausgeführt werden soll. Das setRenderingHint " ist eine der Methoden, mit denen diese Rendering-Hinweise festgelegt werden können. Die Rendering-Hinweise aus der Klasse RenderingHints
können verwendet werden.
Mit diesem Graphics2D
-Objekt kann dann ein Bild mit den zuvor angegebenen Rendering-Hinweisen zum BufferedImage
gezeichnet werden.
Ein grober (ungetesteter) Code würde wie folgt funktionieren:
%Vor%Zu den weiteren Rendering-Hinweisen von Interesse gehören:
Der Abschnitt Rendering-Qualität steuern von The Java Tutorials enthält weitere Informationen wie man die Renderqualität von Graphics2D
Objekten steuert.
Und für eine sehr gute Quelle von Informationen über den Umgang mit grafischen Schnittstellen im Allgemeinen, Filthy Rich Clients von Chet Haase und Romain Guy wird dringend empfohlen . Es gibt einen Abschnitt des Buches, der sich mit dem Problem der Skalierung von Bildern beschäftigt, was ziemlich relevant erscheint.
Coobird hat Recht damit, dass Sie inkrementell herunterskalieren müssen (vorzugsweise mit BICUBIC), um ein gut aussehendes Ergebnis für ein kleines Thumbnail zu erhalten. Image.getScaledInstance verwendet dies mit dem AREA_AVERAGED-Ansatz, aber es ist viel langsamer als der inkrementelle Downscale, der ursprünglich von Chris Campbell in seinem Artikel "Gefahren von Image.getScaledInstance ()" vorgeschlagen wurde.
Bitte entschuldigen Sie die Eigenwerbung hier, aber ich habe eine Handvoll "native Java-Best Practices" gerollt, wenn es um die Skalierung von Bildern in eine Bibliothek mit dem Namen imgscalr .
Es ist verfügbar unter einer Apache 2-Lizenz und die Quelle ist alles auf GitHub; Das Ziel der Bibliothek war es, die Bildskalierung in nativem Java zu vereinfachen (1 Klasse, 5 statische Methoden) und das bestmögliche Ergebnis zu erzielen (was Sie ursprünglich wollten), das schnellste Ergebnis (großartig beim Skalieren unter großen Bildern) ) oder ein Gleichgewicht zwischen den beiden und lassen Sie die Bibliothek entscheiden, welche zu verwenden.
Ich wollte nur eine Lib, die "Größe meines Bildes ändern und mir aus dem Weg gehen kann" und nach dem Lesen all dieser Posts für ein paar Tage, als ich den Schmerzpunkt adressierte (auch meinen eigenen), kehre einfach zurück und teile die Arbeit für jeden anderen kann es helfen.
Coobird hat die richtige Idee. Ich würde auch RenderingHints.VALUE_INTERPOLATION_BILINEAR
interpolation versuchen und sehen, ob es schöner aussieht. Bicubic funktioniert jedoch besser beim Upscaling. Für die besten Ergebnisse beim Herunterskalieren sollte man in mehreren Schritten herunterskalieren . Zuerst die Auflösung halbieren, dann erneut halbieren usw., bis Sie die gewünschte Auflösung erreicht haben (d. H., Sie können nicht halbieren oder das Bild wird zu klein). Der letzte Schritt ist das Herunterskalieren auf die gewünschte Auflösung.
Nehmen wir an, Ihr Eingabebild ist 800x600 und Sie möchten es auf 160x120 verkleinern: