旋转BufferedImage的问题

per*_*erp 10 java image rotation affinetransform

使用AffineTransform类在Java中旋转图像时遇到一些问题.

我有以下方法来创建图像的旋转(90度)副本:

private BufferedImage createRotatedCopy(BufferedImage img, Rotation rotation) {
    int w = img.getWidth();
    int h = img.getHeight();

    BufferedImage rot = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);

    double theta;
    switch (rotation) {
        case CLOCKWISE:
            theta = Math.PI / 2;
            break;
        case COUNTERCLOCKWISE:
            theta = -Math.PI / 2;
            break;
        default:
            throw new AssertionError();
    }

    AffineTransform xform = AffineTransform.getRotateInstance(theta, w / 2, h / 2);
    Graphics2D g = (Graphics2D) rot.createGraphics();
    g.drawImage(img, xform, null);
    g.dispose();

    return rot;
}
Run Code Online (Sandbox Code Playgroud)

旋转是一个简单的枚举,值为NONE,CLOCKWISE和COUNTERCLOCKWISE.

我的问题的症状显示在这里:

http://perp.se/so/rotate_problems.html

因此,旋转工作正常,但生成的图像不会锚定到正确的坐标(或应该如何放置).因为我真的不知道我在做什么(我的线性代数很弱),我不知道如何自己解决这个问题.

我尝试了一些随机摆弄AffineTransform实例,但它没有帮助我(当然).我试过谷歌搜索(并搜索SO),但我见过的所有例子基本上都使用与我相同的方法...这对我不起作用.

感谢您的建议.

fin*_*nnw 17

如果必须将变换表示为单个旋转,则锚点取决于旋转方向:(w/2, w/2)或者是(h/2, h/2).

但是表达的可能更简单translate; rotate; translate,例如

AffineTransform xform = new AffineTransform();
xform.translate(0.5*h, 0.5*w);
xform.rotate(theta);
xform.translate(-0.5*w, -0.5*h);
Run Code Online (Sandbox Code Playgroud)

也考虑使用getQuadrantRotateInstance而不是getRotateInstance.