Wie kann ich ein BufferedImage supersamplen? Ich habe die Möglichkeit, das darzustellende Bild mit einer höheren Auflösung zu rendern als nötig. Gibt es in Java Klassen, die daraus ein kleineres Bild jedoch mit Kantenglättung erstellen? Bis jetzt habe ich nur was von AffineTransform gelesen, mit dem man wohl auch skalieren kann. Aber vielleicht gibt es ja doch noch spezielle Klassen für meinen Anwendungsfall.
BufferedImage (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/BufferedImage.html) erbt von Image die Funktion public Image getScaledInstance(int width, int height, int hints); Als "Hint" kannst du hier folgendes angeben: * SCALE_DEFAULT * SCALE_FAST * SCALE_SMOOTH * SCALE_REPLICATE * SCALE_AREA_AVERAGING Was die einzelnen Optionen genau bewirken kannst du bei der Funktion nachlesen. Ansonsten warum willst du das Bild den "supersampeln" aktiviere doch gleich bevor du es zeichnest das Antialiasing. dazu habe ich mir eine Funktion geschrieben:
1 | public static RenderingHints getHQRenderingHints() { |
2 | RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
3 | hints.put( |
4 | RenderingHints.KEY_ALPHA_INTERPOLATION, |
5 | RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); |
6 | hints.put( |
7 | RenderingHints.KEY_RENDERING, |
8 | RenderingHints.VALUE_RENDER_QUALITY); |
9 | return hints; |
10 | }
|
Das kannst du dann in deinem Code einfach verwenden mittels:
1 | BufferedImage image = new .... |
2 | Graphics2D g = image.createGraphics(); |
3 | g.setRenderingHints(getHQRenderingHints()); |
Funktioniert deine Methode auch wenn man Pixelweise auf dem BufferedImage zeichnet? Ich berechne verschiedene Fraktale. Dabei wird jedes Pixel einzeln gesetzt.
Probiers aus geht doch nix kaputt... ;) Allerdings macht ein Antialliasing beim Zugriff auf Einzelpixel keinen Sinn, die Graphics2D hat auch nur Funktionen für linien/shapes oder läßt du dir den Pixelbuffer des Buffered Image zurückliefern? Wenn ja dann geht nur erstere Methode (es sei den du machst das antialliasing selbst, was wie gesagt bei einem einzelnen Pixel recht schwer ist). Falls du das machst, laß dir am Anfang den ganzen Pixelbuffer zurückgeben und greif dann direkt drauf zu anstelle der setPixel Funktion.
Also ich rendere jetzt die doppelte Auflösung und skaliere das mit SCALE_AREA_AVERAGING wieder auf 100% runter, sieht ganz ok aus, jedenfalls deutlich besser als Blur. ;) Danke.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.