0

我正在尝试旋转在 Java 中加载的 png。我遇到的问题是,当我旋转图像时,它似乎也弄乱了图像的位置。我正在旋转一个 60x60 的图像,所以我假设旋转它不会移动图像。有没有一种方法可以在不移动图像的情况下旋转图像或设置仿射变换的坐标?

        AffineTransform identity = new AffineTransform();
        gr.setColor(Color.red);

        gr.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY );

        AffineTransform trans = new AffineTransform();
        trans.setTransform(identity);
        trans.rotate( -Math.toRadians(15) );
        trans.translate(-25, 220);

        gr.drawImage(body.getImage(), 0, 200, null);
        gr.drawImage(gun.getImage(), trans, this);
4

2 回答 2

4

AffineTransform实例可以使用 . 连接(相加)concatenate(AffineTransform)。旋转图像的一般方法是。


其实看看方法

  • getRotateInstance(double theta, double anchorx, double anchory)
    返回围绕锚点 旋转坐标的变换。该操作相当于平移坐标使锚点位于原点(S1),然后围绕新原点旋转(S2),最后平移使中间原点恢复到原始锚点的坐标(S3)。
  • getRotateInstance(double vecx, double vecy, double anchorx, double anchory)
    返回将围绕锚点坐标(原文如此)的坐标旋转到旋转向量的变换。所有坐标都围绕指定的锚点坐标旋转相同的量。旋转量使得沿前一个正 X 轴的坐标随后将与从原点指向指定矢量坐标的矢量对齐。如果 vecx 和 vecy 都是 0.0,则返回恒等变换。该操作相当于调用: ...

感谢 Donal Fellows 提示我使用 RTM。

于 2012-01-25T13:13:00.340 回答
1

旋转时自己遇到了一些复杂性。旋转 90 度是最成问题的。

有一个 API 可以很好地处理这个问题,那就是imgscalr

代码:

BufferedImage rotatedPhoto = Scalr.rotate(photo, Scalr.Rotation.CW_90, null);

没有使用 imgscalr 进行缩放和翻译,标准 java.awt 在那里就可以了。

因为这会产生新的图像照片;确保用 var.flush() 刷新/清空旧的;

干杯

于 2012-02-02T02:03:19.860 回答