如何根据两点旋转图像

时间:2011-04-07 14:31:56

标签: java image image-rotation

我有一些我操纵的图像,在这些图像中我总是有两个点(x1,y1)和(x2,y2)。像这样:

|----------------|
|                |
|    .           |
|                |
|          .     |
|                |
|----------------|

我需要编写一个algorythm来像这样对齐图像

|----------------|
|                |
|                |
|    .     .     |
|                |
|                |
|----------------|

我已经阅读了this个问题但是通过

获得的角度
double angle = Math.Atan2(pointB.Y - pointA.Y, pointB.X - pointA.X);

在java中使用此旋转代码时无法正常工作:

public static BufferedImage tilt(BufferedImage image, double angle) {
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
    int w = image.getWidth(), h = image.getHeight();
    int neww = (int) Math.floor(w * cos + h * sin), newh = (int) Math
            .floor(h * cos + w * sin);
    GraphicsConfiguration gc = getDefaultConfiguration();
    BufferedImage result = gc.createCompatibleImage(neww, newh,
            Transparency.OPAQUE);
    Graphics2D g = result.createGraphics();

    g.setColor(Color.white);
    g.setBackground(Color.white);
    g.fillRect(0, 0, neww, newh);

    g.translate((neww - w) / 2, (newh - h) / 2);

    g.rotate(angle, w / 2, h / 2);
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
}

在之前提及的帖子中,他们使用c#代码,如

myImage.TranslateTransform(-pointA.X, -pointA.Y);
myImage.RotateTransform((float) angle, MatrixOrder.Append);
myImage.TranslateTransform(pointA.X, pointA.Y, MatrixOrder.Append);

对于这种情况,有没有人可以帮助实现java?

3 个答案:

答案 0 :(得分:1)

好的...为了解决这个问题,我刚刚将Math.atan2返回的弧度值转换为度数,旋转效果很好。

Thanx大家

答案 1 :(得分:0)

如果示例中的左侧点是A,并且示例中的右侧点是B,请设想绘制具有90度角的点C(A.X,B.Y)以完成三角形。如果您使用几何计算来计算角A的角度,您就知道要旋转多少。

答案 2 :(得分:0)

对我来说,下面的工作是对齐OMR纸张标记,其中pointA是TopLeft Corner标记,pointB是BottomLeft角标记

双角= Math.Atan2(pointB.x - pointA.x,pointB.y - pointA.y);