Antialiasing/Supersampling in Java ohne Zusatspakete?

Gast #1293136
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.
Persönliche Seite #1293653
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());
Persönliche Seite #1296071
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.