Frage

Ich bin ein vernünftig erfahrener Java -Programmierer, aber relativ neu für Java2d. Ich versuche, ein Bild zu skalieren, aber ich bekomme schlechte Qualitätsergebnisse. Das Bild ist eine Vorschau eines Panels und enthält also Dinge wie Text und Textfelder. Ich werde immer nach unten skalieren, nie auf.

Derzeit verwende ich den folgenden Code:-

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

Wenn PanelImage die volle Vorschau (gepufferte) und scaledwidth und scaledheight ist, sind die jeweiligen Zielabmessungen. Ich scheine viele Details im Text und in den Kanten von Dingen wie Textfeldern usw. zu verlieren.

Gibt es einen besseren Anruf, den ich verwenden sollte, um das Bild zu skalieren?

Danke, John

War es hilfreich?

Lösung

Ein Vorschlag, den ich machen kann, ist, das Bild zuerst die Größe des Bildes auf einen separaten BufferedImage. Der Grund ist ein, a Graphics2D Objekt der BufferedImage kann erhalten werden, um ein skaliertes Bild von besserer Qualität zu erzeugen.

Graphics2D kann "Rendering Tipps" akzeptieren, die die Art und Weise anweisen, wie die Bildverarbeitung von der durchgeführt werden sollte Graphics2D Objekt. Das setRenderingHint Die Methode ist eine der Methoden, mit denen die Rendering -Hinweise festgelegt werden können. Die Rendering -Hinweise aus der RenderingHints Klasse kann verwendet werden.

Dann verwenden Sie das Graphics2D Objekt kann ein Bild zu dem gezeichnet werden BufferedImage Verwenden der zuvor angegebenen Rendering -Hinweise.

Ein grobe (ungetestete) Code würde wie folgt funktionieren:

BufferedImage scaledImage = new BufferedImage(
    scaledWidth,
    scaledHeight,
    BufferedImage.TYPE_INT_RGB
);

Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
    RenderingHints.Key.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();

Weitere Interessensfälle können umfassen:

Das Kontrolle der Rendering -Qualität Der Abschnitt der Java -Tutorials enthält auch weitere Informationen zur Kontrolle der Rendering -Qualität von Graphics2D Objekte.

Und für eine sehr gute Informationsquelle zum Umgang mit grafischen Schnittstellen im Allgemeinen, Schmutzige reiche Clients Von Chet Haase und Romain Guy wird sehr empfohlen. Es gibt einen Abschnitt des Buches, der sich mit der Frage der Skalierungsbilder befasst, was sehr relevant erscheint.

Andere Tipps

Vielleicht sollten Sie anrufen:

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

und

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Coobird ist recht, dass Sie inkrementell nach unten (vorzugsweise mit Bicubic verwenden) ein gut aussehendes Ergebnis für ein klein genuges Vorschaubild erzielen müssen. Image.GetScaledInstance, der dies mit dem Area -Averaged -Ansatz tat, ist jedoch viel langsamer als die inkrementelle heruntergekommene, die von Chris Campbell in seinen "Perils of Image.GetscaledInstance ()" -Aktion original vorgeschlagen wurde.

Bitte entschuldigen Sie die Selbstwerbung hier, aber ich habe eine Handvoll "einheimischer Java-Best Practices" eingeführt, wenn es darum geht, sich in eine Bibliothek namens zu skalieren IMGSCALR.

Es ist unter einer Apache 2 -Lizenz verfügbar und die Quelle befindet sich auf GitHub. Das Ziel der Bibliothek war es, die Bildskalierung in nativen Java-Dead-Easy (1 Klasse, 5 statische Methoden) zu erzielen und das am besten aussehende Ergebnis (das, was Sie ursprünglich gewünscht haben), das schnellste Ergebnis (großartig bei der Skalierung zwischen großen Bildern ) oder eine Balance zwischen den beiden und lassen Sie die Bibliothek entscheiden, welche sie verwenden sollen.

Ich wollte nur eine Lib, die "mein Bild ändern und mir aus dem Weg gehen" und nach dem Lesen all dieser Beiträge für ein paar Tage, als ich mich mit dem Schmerzpunkt (auch meinem eigenen) befasste sonst kann es helfen.

Coobird hat die richtige Idee. Ich würde es auch versuchen RenderingHints.VALUE_INTERPOLATION_BILINEAR Interpolation und prüfen Sie, ob es schöner aussieht. Bicubic funktioniert jedoch besser, wenn sie hochkalkalieren. Für die besten Ergebnisse beim Downscaling sollte man sollte in mehreren Schritten abgeschaltet. Nehmen Sie zuerst die Auflösung, dann wieder halbieren usw., bis Sie sich der gewünschten Auflösung nähern (dh Sie können nicht halbieren oder das Bild wird zu klein). Der letzte Schritt besteht darin, die gewünschte Auflösung zu skalieren.

Nehmen wir zum Beispiel an, Ihr Eingabebild ist 800x600 Und Sie möchten heruntergekommen 160x120:

  1. Heruntergekommener 50%. --> 400x300
  2. Heruntergekommener 50%. --> 200x150
  3. Downskala zu 160x120.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top