使用AffineTransform Java旋转图像时的偏移错误

时间:2019-04-13 19:49:55

标签: java image-processing

我正在尝试使用AffineTransform类旋转图像。但是,当旋转例如90度时,图像会更改其宽度和高度值,从而导致我要删除的偏移。

这是我尝试过的

OpRotate.java

    public BufferedImage filter(BufferedImage src, BufferedImage dest) {

        // Parameter auswerten
        float rotationAngle = ((float) attributes.getAttributeByName("Desired rotation angle").getValue());

        AffineTransform rotationTransformation = new AffineTransform();
        double middlePointX = src.getHeight() / 2;
        double middlePointY = src.getWidth() / 2;


        rotationTransformation.setToRotation(Math.toRadians(rotationAngle), middlePointX, middlePointY);

        operation = new AffineTransformOp(rotationTransformation, AffineTransformOp.TYPE_BILINEAR);

        return operation.filter(src, dest);

    }

将图像向右旋转90度后,结果如下:

result

1 个答案:

答案 0 :(得分:0)

在我看来,使用models.ForeignKey旋转图像有点违反直觉...旋转本身很容易,但是您可能已经发现,困难的部分可以正确地平移,因此图像旋转后的 图像的左上部分(如果是非象限旋转,则为边界框)。

如果需要旋转任意角度,则可以使用以下非常通用的代码:

AffineTransformOp

但是,如果您只想旋转90度的倍数,则可以使用这种稍快的变体:

public static BufferedImage rotate(BufferedImage src, double degrees) {
    double angle = toRadians(degrees); // Allows any angle

    double sin = abs(sin(angle));
    double cos = abs(cos(angle));

    int width = src.getWidth();
    int height = src.getHeight();

    // Compute new width and height
    double newWidth = width * cos + height * sin;
    double newHeight = height * cos + width * sin;

    // Build transform
    AffineTransform transform = new AffineTransform();
    transform.translate(newWidth / 2.0, newHeight / 2.0);
    transform.rotate(angle);
    transform.translate(-width / 2.0, -height / 2.0);

    BufferedImageOp operation = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);

    return operation.filter(src, null);
}