Forum: PC-Programmierung Java Bild-Skalierungsproblem


von Manfred (Gast)


Angehängte Dateien:

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:
1
BufferedImage newImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
2
3
Graphics2D g = newImg.createGraphics();
4
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
5
g.setRenderingHint(RenderingHints.KEY_DITHERING , RenderingHints.VALUE_DITHER_ENABLE);
6
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
7
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
8
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
9
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
10
11
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

von Manfred (Gast)


Lesenswert?

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

Dann klappts.

von Läubi .. (laeubi) Benutzerseite


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.

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.