在Java中旋转png

时间:2012-01-25 13:07:41

标签: java image affinetransform

我正在尝试旋转用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);

2 个答案:

答案 0 :(得分:4)

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


实际上,请查看

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

感谢Donal Fellows提示我参加RTM。

答案 1 :(得分:1)

我自己通过轮换遇到了一些复杂性。旋转90度是最成问题的。

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

代码:

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

没有使用imgscalr进行缩放和翻译,标准java.awt会在那里做得很好。

因为这会制作一张新的Image照片;一定要用var.flush();

刷新/清空旧的

干杯