Forum: PC-Programmierung Antialiasing/Supersampling in Java ohne Zusatspakete?


von Frage (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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());

von Frage (Gast)


Lesenswert?

Vielen Dank, werde ich ausprobieren.

von Frage (Gast)


Lesenswert?

Funktioniert deine Methode auch wenn man Pixelweise auf dem 
BufferedImage zeichnet? Ich berechne verschiedene Fraktale. Dabei wird 
jedes Pixel einzeln gesetzt.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Frage (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.