# rotate VolatileImage



## eliteSchaf (14. Dez 2011)

Hey Leute!

Ich hab hier ein kleines Problem.

Ich hab ein VolatileImage, welches einen Sprite enthält und rundherum ist das Bild transparent.
Jetzt will ich ich das ganze Bild einfach drehen, jedoch sind danach
die Ecken des Bildes nicht mehr transparent, odern weiß. 

Hat da jemand ne Idee? 
Oder soll ich das Ganze in ein BufferedImage umwandeln, drehen und dann wieder in ein VolatileImage reinschreiben?


Mfg,
eliteSchaf


----------



## AngryDeveloper (15. Dez 2011)

Der Zeichencode wäre nicht schlecht.

Kann sein, dass du mit setBackground und clearRect den Hintergrund noch neu zeichnen musst um die Ecken transparent zu bekommen.


----------



## eliteSchaf (15. Dez 2011)

Also der Code zum Zeichnen funktioniert richtig. Wenn ich das Bild nicht drehe, sprich die erste If-Bedingung true ist, dann wird es richtig dargestellt.


```
public static VolatileImage rotateImage(VolatileImage img, double angleRadiants) {
		
		//If we don't need to rotate it, just return the image
		if(angleRadiants == Math.toRadians(0)) {
			return img;
		}
		GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
		VolatileImage tmp = gc.createCompatibleVolatileImage(img.getWidth(null), img.getHeight(null), Transparency.BITMASK);
		Graphics2D g = tmp.createGraphics();
		
		g.setComposite(AlphaComposite.Src);
		g.setColor(Color.black);
		g.clearRect(0, 0, tmp.getWidth(), tmp.getHeight());
		
		AffineTransform rotateTransform = new AffineTransform();
		rotateTransform.rotate(angleRadiants, img.getWidth() / 2, img.getHeight() / 2);
		g.setTransform(rotateTransform);
		
		g.setComposite(AlphaComposite.Src);
		g.setColor(Color.black);
		g.clearRect(0, 0, tmp.getWidth(), tmp.getHeight());
		
		g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), null);
		
		g.dispose();
		
		return tmp;
}
```


----------



## AngryDeveloper (15. Dez 2011)

Versuch mal statt g.setColor ein g.setBackground vor dem clearRect.
Alternativ das setColor lassen und statt clearRect ein fillRect.


----------



## Guybrush Threepwood (15. Dez 2011)

VolatileImage gibt es nicht mit Alpha-Kanal. Du musst ein BufferedImage nehmen.

P.S.: Das Problem hatten schon viele Leute, z. B. http://www.java-forum.org/spiele-multimedia-programmierung/109916-swing-volatileimage.html


----------



## AngryDeveloper (15. Dez 2011)

VolatileImage kann doch Transparenz? (seit 1.5 denke ich)
Java:Tutorials:VolatileImage - GPWiki

Edit:
clearRect() nutzt allerdings eben die Background Color und nicht die über setColor gesetzte Farbe.
Aus der API:


> Clears the specified rectangle by filling it with the background color of the current drawing surface. This operation does not use the current paint mode.
> Beginning with Java 1.1, the background color of offscreen images may be system dependent. Applications should use setColor followed by fillRect to ensure that an offscreen image is cleared to a specific color.


----------



## eliteSchaf (15. Dez 2011)

Hab jetzt alle erdenklichen Kombinationen durchprobiert, jedoch ohne Erfolg.

Habs jetzt zur Zeit über ein BufferedImage gelöst


----------

