Schnelle qualitativ gute Bildskalierung? (realtime)

nicco80

Mitglied
Hi,

ich suche eine Möglichkeit ein Bild (BufferedImage) beim Zeichnen möglichst qualitativ gut zu skalieren.
Bisher benutze ich
Java:
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
Java:
			AffineTransform at = g2.getTransform();
			g2.scale(zoom, zoom);
			g2.drawImage(bufImage, 
					0,
					0, this);
			g2.setTransform(at);
 

nicco80

Mitglied
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!

Java:
	g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

	g2.drawImage(...);

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

nicco80

Mitglied
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
 

Ähnliche Java Themen


Oben