如何在java中逆时针旋转图像?

时间:2011-10-14 12:03:52

标签: java image graphics2d

我有一个图像,我希望它以逆时针方向移动,这是我的问题。我有一个代码,但似乎我的代码无法正常工作。如果我犯了错误,你可以查看我的代码。请帮我解决这件事......

这是我的代码:

public void move(long dt)
{

    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;
    double dy_m = speed * dt_s;

    double width = board.x1_world;
    double height = board.y1_world;

    double min_height = 0.0;
    double max_height = height;
    double min_width = 0.0;
    double max_width = width;

    x += dx_m;
    if (x >= max_width)
    {
        x = max_width;

        if (y >= min_height)
        {
            y += dy_m;
        }
    }
    if (y >= max_height)
    {
        y = max_height;
        if (x >= min_width)
        {
            dx_m *= -1;
        }
    }
    if (x <= min_width)
    {
        x = min_width;
        if (y <= max_height)
        {
            y -= dy_m;
        }
    }
    if (y <= min_height)
    {
        y = min_height;
        if (x <= max_width)
        {
            dx_m *= -1;
        }
    }


}


@Override
public void render(Graphics2D g2d)
{
    AffineTransform t = g2d.getTransform();

    double height = 0.3;//meter
    double width = 0.3;//meter

    double bird_footy = height;
    double bird_footx = width / 2;


    int xx = board.convertToPixelX(x - bird_footx);
    int yy = board.convertToPixelY(y + bird_footy);

    g2d.translate(xx, yy);

    double x_expected_pixels = width * board.meter;
    double y_expected_pixels = height * board.meter;

    double x_s = x_expected_pixels / ((ToolkitImage) birdImage).getWidth();

    double y_s = y_expected_pixels / ((ToolkitImage) birdImage).getHeight();

    g2d.scale(x_s, y_s);
    g2d.drawImage(getImage(), 0, 0, this);

    g2d.setColor(Color.BLACK);

    g2d.setTransform(t);
}

1 个答案:

答案 0 :(得分:1)

你去吧:

import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;

class RT {
    public static void main(String[] args) throws java.io.IOException {
        BufferedImage img = ImageIO.read(new File("input-image.png"));

        BufferedImage rotated = new AffineTransformOp(
                AffineTransform.getQuadrantRotateInstance(
                    3, img.getWidth() / 2, img.getHeight() / 2),
                AffineTransformOp.TYPE_BILINEAR).filter(img, null);

        ImageIO.write(rotated, "PNG", new File("output-image.png"));
    }
}
  • 将您的图片加载<{em> BufferedImageImageIO辅助方法
  • 创建一个AffineTransformOp对象,并为其提供一个旋转实例转换,最好是QuadrantRotateInstance,因为您有兴趣完全按 90°旋转。 3表示3个象限,因此每次旋转90度三次;这相当于一个逆时针旋转。
  • 传递您喜欢的品质因数,通常选择的是BILINEAR方法,这是半快速和半质量的。
  • filter你的转变;也就是说,将其应用于图像。过滤返回一个新的BufferedImage,或者将新图像存储在给定filternull上面的第二个参数中 - 我们将图像存储在新的BufferredImage对象中)< / LI>
  • write或将图片保存到文件中。

注释
这是一个关于如何进行高效90°变换的非常快速的示例。这不是唯一的途径。拿这个代码并适合你的。确保正确处理例外(与我的例子不同) 如果您想了解更多信息,请阅读 javadoc 中有关每个对象的更多信息。


Woops

是的,sooo,我看到 - 在阅读OP代码后 - 实际上这是无关,导致OP似乎想要一个 visual < / em>旋转,不仅仅是旋转图像并呈现它 如果有人碰到这个问题并且正在寻找这个问题,我会把它留在这里 其余的,请忽略它