# Schnelle qualitativ gute Bildskalierung? (realtime)



## nicco80 (17. Mai 2010)

Hi, 

ich suche eine Möglichkeit ein Bild (BufferedImage) beim Zeichnen möglichst qualitativ gut zu skalieren.
Bisher benutze ich

```
graphics2d.drawImage(bufImage, 0,0, width * zoom, height * zoom);
```
wobei zoom so zw. 0.25 und 1.5 liegt, also keine ganz grossen pixel-reduktionen.
Ich habe einiges dazu gefunden, aber leider sind die Ansätze durchweg entweder für qualitativ
hochwertige bildskalierung oder benutzen .getScaledInstance(...) mit z.B. bilinear  gefiltertetem output und würden dann bei jedem repaint() Speicher allozieren.

Gibt es was das mit geringem (Rechen-)Mehraufwand wenigstens die unschönen Treppen-klötzchen vermeidet und trotzdem keinen extra Speicher benötigt?

Danke schonmal fürs feedback,
Nico

ps.
ich habe auch schonmal das hier versucht, das hat aber leider die selben artefakte

```
AffineTransform at = g2.getTransform();
			g2.scale(zoom, zoom);
			g2.drawImage(bufImage, 
					0,
					0, this);
			g2.setTransform(at);
```


----------



## Steev (17. Mai 2010)

Du könntest es doch mal mit Graphics2D#setRenderingHints versuchen. Soweit ich weis konnte man da auch die Skalierungsqualität angeben...

Graphics2D (Java 2 Platform SE 5.0)


----------



## nicco80 (17. Mai 2010)

Steev hat gesagt.:


> Du könntest es doch mal mit Graphics2D#setRenderingHints versuchen. Soweit ich weis konnte man da auch die Skalierungsqualität angeben...



Ja, damit klappt es ganz so wie ich es mir vorgestellt habe, danke!


```
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

	g2.drawImage(...);

	g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
```


----------



## Kr0e (17. Mai 2010)

Wenn du das ganze nun auch noch ultimativ schnell haben willst, nutze OpenGL Hardware Skalierung.


----------



## nicco80 (17. Mai 2010)

Ja, mit jogl ginge das aber ich glaub, da braucht man zusätzliche runtime dependencies

So ein bilinearer Filter ist natürlich etwas langsamer, aber mir reicht das so, 
ist von der Umsetzung ideal einfach.

Wen es interessiert ich habe folgende recht gute Bibliothek ausfindig gemacht java-image-scaling - Project Hosting on Google Code und hier noch einen Blog (mit Thread auf Alternativen) Component House - High-Quality Image Resize with Java
mit verschiedenen anderen Verfahren. :rtfm:

Danke und Grüße


----------



## Marco13 (17. Mai 2010)

Hier noch als Ergänzung der "Klassiker" zu diesem Thema: The Perils of Image.getScaledInstance() | Java.net


----------

