在Java中快速旋转图像部分

问题描述:

我想旋转,缩放和翻译图像的一部分。例如,我有一个精灵表,包含精灵的列和行。我可以将需要的部分绘制到临时的BufferedImage上,然后将该临时图像转换为主图形,但这是一个非常慢的操作。在Java中快速旋转图像部分

我该如何让这个快得多?它需要每秒发生超过100 * 60次。

public void Draw_WorldSpace(Graphics2D g, double x, double y, double angle, double deltaTime) { 
    // setup portion of image to transform 
    BufferedImage tempImage = new BufferedImage(sourceRectangle.width, sourceRectangle.height, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = tempImage.createGraphics(); 
    g2.drawImage(image, 0, 0, sourceRectangle.width, sourceRectangle.height, sourceRectangle.x, sourceRectangle.y, sourceRectangle.width, sourceRectangle.height, null); 
    g2.dispose(); 

    // setup a transformation object 
    AffineTransform transform = new AffineTransform(); 
    // match view rotation 
    transform.translate(GameLogic.viewPort.GetCanvasCenter().x, GameLogic.viewPort.GetCanvasCenter().y); 
    transform.rotate(Math.toRadians(GameLogic.viewPort.GetAngle())); 
    transform.translate(-GameLogic.viewPort.GetCanvasCenter().x, -GameLogic.viewPort.GetCanvasCenter().y); 
    // set to position 
    transform.translate(x - GameLogic.viewPort.GetViewPortCenter().x + GameLogic.viewPort.GetCanvasCenter().x, y - GameLogic.viewPort.GetViewPortCenter().y + GameLogic.viewPort.GetCanvasCenter().y); 
    // rotate 
    transform.rotate(Math.toRadians(angle)); 
    // center on sprite 
    transform.translate(-sourceRectangle.width/2, -sourceRectangle.height()/2); 
    // draw the sprite 
    g.drawImage(tempImage, transform, null); 
} 
+0

事先做好它并将旋转的精灵存储在'List '中。 –

+1

可以直接在“主”Graphics上执行翻译,而不是在子图像上执行翻译? – MadProgrammer

+0

什么需要发生超过六千赫? – trashgod

最终我做了什么Hovercraft Full Of Eels建议。我不是解决方案的最大粉丝,因为它需要大量的内存开销。但最终,它像一个魅力,甚至游戏我更简化的控制图形,所以这真的很酷。