Java中的旋转PNG

Java中的旋转PNG,java,image,affinetransform,Java,Image,Affinetransform,我正在尝试旋转一个用Java加载的png。我的问题是,当我旋转图像时,它似乎也会弄乱图像的位置。我正在旋转一个60x60的图像,所以我假设旋转它不会移动图像。有没有一种方法可以在不移动图像的情况下旋转图像,或者设置仿射变换的坐标 AffineTransform identity = new AffineTransform(); gr.setColor(Color.red); gr.setRenderingHint(RenderingHints.K

我正在尝试旋转一个用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);
实例可以使用连接(添加在一起)。旋转图像的一般方法是

  • 将图像的中心移动到原点()
  • 旋转图像()
  • 将其移回原始坐标()

事实上,请注意以下方法:


  • 返回围绕定位点旋转坐标的变换。此操作相当于平移坐标,使定位点位于原点(S1),然后围绕新原点(S2)旋转坐标,最后平移,使中间原点恢复到原始定位点(S3)的坐标

  • 返回一个变换,该变换将围绕锚点手风琴(sic)旋转坐标到旋转向量。所有坐标围绕指定的定位点坐标旋转相同的量。旋转量使得沿前一个正X轴的坐标随后将与从原点指向指定矢量坐标的矢量对齐。如果vecx和vecy均为0.0,则返回标识转换。此操作相当于调用:
感谢Donal Fellows提示我使用RTM。

实例可以使用连接(添加到一起)。旋转图像的一般方法是

  • 将图像的中心移动到原点()
  • 旋转图像()
  • 将其移回原始坐标()

事实上,请注意以下方法:


  • 返回围绕定位点旋转坐标的变换。此操作相当于平移坐标,使定位点位于原点(S1),然后围绕新原点(S2)旋转坐标,最后平移,使中间原点恢复到原始定位点(S3)的坐标

  • 返回一个变换,该变换将围绕锚点手风琴(sic)旋转坐标到旋转向量。所有坐标围绕指定的定位点坐标旋转相同的量。旋转量使得沿前一个正X轴的坐标随后将与从原点指向指定矢量坐标的矢量对齐。如果vecx和vecy均为0.0,则返回标识转换。此操作相当于调用:

多亏了多纳尔·费罗斯(Donal Fellows)的鼓励,我选择了RTM。

我自己在轮换时遇到了一些麻烦。旋转90度是最大的问题

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

代码:

如果没有使用imgscalr进行缩放和转换,那么标准java.awt就可以了

因为这是一张新的图像照片;确保使用var.flush()刷新/空值旧版本


啦啦队

在轮换中遇到了一些复杂性。旋转90度是最大的问题

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

代码:

如果没有使用imgscalr进行缩放和转换,那么标准java.awt就可以了

因为这是一张新的图像照片;确保使用var.flush()刷新/空值旧版本


干杯

您正在调用
.translate()
这是故意的吗?我这样做是为了尝试将图像移回原位,但数量会根据您旋转的程度而变化。您正在调用
.translate()
这是故意的吗?我这样做是为了尝试将图像移回原位,但是数量的变化取决于旋转的程度。带有anchorx/y参数的方法确实如此。@DonalFellows添加了这一信息。我不知道答案。感谢您的澄清。带有anchorx/y参数的方法确实就是这样。@DonalFellows补充了这一信息。我不知道答案。谢谢你的澄清。
BufferedImage rotatedPhoto = Scalr.rotate(photo, Scalr.Rotation.CW_90, null);