2D-Grafik AffineTransformation

B

burnie

Gast
Hallo Leute,

ich hab ein kleines Problem mit meiner affinen Transformation! Ich habe ein Set voller Bilder und möchte diese JSlider je nach JSlider value anzeigen. Da ich das BufferedImage skaliere um es genau auf die größe des JPanels zu bekommen benutze ich meine affine Transformation. Das ganze sieht wie folgt aus:
Java:
@Override
public synchronized void paint(Graphics g) {
	Graphics2D g2d = (Graphics2D) g;
	super.paint(g2d);
	g2d.transform(calculateAffineTransformWithoutRotation());
	g2d.drawImage(getImage(), 0, 0, null);
	drawLines(g2d, Color.GREEN);
}
private AffineTransform calculateAffineTransformWithoutRotation() {
	AffineTransform trans = new AffineTransform();
	float zoomFactorx = new Float(this.getWidth()) / new Float(getImage().getWidth());
	float zoomFactory = new Float(this.getHeight()) / new Float(getImage().getHeight());
	trans.scale(zoomFactorx, zoomFactory);

	return trans;
}

Für Ideen bin ich gern zu haben!

grüße

burnie
 
B

burnie

Gast
exakt, dass problem an der sache ist, dass die die berechnung der skalierung eines neuen bildes extrem lange dauert! also ca eine halbe sekunde, so kann man überhaupt nicht flüssig durchgehen. Verwende ich die die Affine Transformation hingegen nicht und skaliere die Bilder also nicht läuft es absolut flüssig
 

Marco13

Top Contributor
Kannst mal schauen, ob es schneller wird, wenn du nicht
Code:
AffineTransform at = forSize(realSizeX, realSizeY, desiredSizeX, desiredSizeY)
g.transform(at);
g.drawImage(image,0,0,this);
machst, sondern
Code:
g.drawImage(image,0,0,desiredSizeX, desiredSizeY,this);
D.h. das Bild einfach nur "kleiner zeichnen". Es kann aber auch sein, dass das keinen sooo großen Unterschied macht. Bilder skalieren IST relativ aufwändig...
 
B

burnie

Gast
Jo das skalieren leider nicht ganz schnell ist wusste ich, dass es aber so lahm ist wusste ich nicht :). Naja ich werds mal mit deiner Lösung probieren ich kann mir aber kaum vorstellen, dass es wirklich viel mehr perfomance bringt
 

Marco13

Top Contributor
Mit etwas Glück schon: Man sollte davon ausgehen können, dass er bei der zweiten Methode erkennt, dass er ja "nur" skalieren muss, und dann u.U. irgendwelche Hardwarenahen Funktionen dafür verwendet (sofern vorher nicht schon eine andere, nicht-trivale AffineTransform gesetzt wurde). Bei der ersten bekommt er "irgendeine" AffineTransform, und muss die verwenden - da könnte eine Rotation drinstecken, und damit muss er klarkommen, und er kann kaum feststellen, dass hier halt KEINE drinsteckt. Wie auch immer.
 

Ähnliche Java Themen


Oben