mikrocontroller.net

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


Autor: Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BufferedImage 
(http://java.sun.com/j2se/1.4.2/docs/api/java/awt/i...) 
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:
public static RenderingHints getHQRenderingHints() {
    RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    hints.put(
     RenderingHints.KEY_ALPHA_INTERPOLATION,
     RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
     hints.put(
     RenderingHints.KEY_RENDERING,
     RenderingHints.VALUE_RENDER_QUALITY);
    return hints;
}
Das kannst du dann in deinem Code einfach verwenden mittels:
BufferedImage image = new ....
Graphics2D g = image.createGraphics();
g.setRenderingHints(getHQRenderingHints());

Autor: Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, werde ich ausprobieren.

Autor: Frage (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.