mikrocontroller.net

Forum: PC-Programmierung Java Bild-Skalierungsproblem


Autor: Manfred (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

Java mag mich nicht! Ich hab versucht ein Bild zu skalieren von 
417x313px auf 150x113px zu skalieren. Ich hab es so gemacht:
BufferedImage newImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);

Graphics2D g = newImg.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_DITHERING , RenderingHints.VALUE_DITHER_ENABLE);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

g.drawImage(img, 0, 0, newWidth, newHeight, 0, 0, oldW, oldH, null);

Das Problem ist, das Bild wird scheinbar beim Verkleinern nicht 
interpoliert. Das eine Bild zeigt, was mit Java rauskommt, das Andere 
von Gimp mit bikubischer Interpolation. Sogar mit bilinearer 
Interpolation siehts unter Gimp noch besser aus.

Weiß jemand, was ich da falsch mache?

Ich denke, ich verwende momentan die OpenJDK6 Java Runtime.

Viele Grüße,
Manfred

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, so wird's gemacht:
Image temp1 = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); 
g.drawImage(temp1, 0, 0, null);

Dann klappts.

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

Bewertung
0 lesenswert
nicht lesenswert
Die Rendering Hints beziehen sich nur darauf wie Java Grafikobjekte 
zeichnet/Rendert... (z.B. Linien, Kreise etc., zumal es nur Hinweise 
sind das zu nutzen, ob das unterliegende Graphicsdevice das versteht ist 
nochmal eine andere Geschichte).
Entweder man macht es über eine "ScaledInstance" oder man setzt den 
Scalefactor bevor man das Bild 1:1 zeichnet weiß aber gerade auch nicht 
ob dann das Ergebnis besser wird. Für Bilder ist die Methode über 
ScaledInstance jedenfalls recht gut von der Qualität und Speed her.

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.