Antialiasing/Supersampling in Java ohne Zusatspakete?

Gast #1293136
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.
Persönliche Seite
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());
Gast
Funktioniert deine Methode auch wenn man Pixelweise auf dem 
BufferedImage zeichnet? Ich berechne verschiedene Fraktale. Dabei wird 
jedes Pixel einzeln gesetzt.
Persönliche Seite
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.