围绕它的中心旋转图片

时间:2011-04-19 20:08:53

标签: java awt

有一种简单的方法可以围绕它的中心旋转图片吗?我首先使用AffineTransformOp。看起来很简单,需要找到一个矩阵的正确参数应该在一个漂亮而整洁的谷歌会话中完成。所以我想......

我的结果是:

public class RotateOp implements BufferedImageOp {

    private double angle;
    AffineTransformOp transform;

    public RotateOp(double angle) {
        this.angle = angle;
        double rads = Math.toRadians(angle);
        double sin = Math.sin(rads);
        double cos = Math.cos(rads);
        // how to use the last 2 parameters?
        transform = new AffineTransformOp(new AffineTransform(cos, sin, -sin,
            cos, 0, 0), AffineTransformOp.TYPE_BILINEAR);
    }
    public BufferedImage filter(BufferedImage src, BufferedImage dst) {
        return transform.filter(src, dst);
    }
}

如果忽略旋转90度的倍数(sin()和cos()无法正确处理的情况),真的很简单。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图像中心的正常预期。所以我在我的过滤器中添加了一些东西:

    public BufferedImage filter(BufferedImage src, BufferedImage dst) {
        //don't let all that confuse you
        //with the documentation it is all (as) sound and clear (as this library gets)
        AffineTransformOp moveCenterToPointZero = new AffineTransformOp(
            new AffineTransform(1, 0, 0, 1, (int)(-(src.getWidth()+1)/2), (int)(-(src.getHeight()+1)/2)), AffineTransformOp.TYPE_BILINEAR);
        AffineTransformOp moveCenterBack = new AffineTransformOp(
            new AffineTransform(1, 0, 0, 1, (int)((src.getWidth()+1)/2), (int)((src.getHeight()+1)/2)), AffineTransformOp.TYPE_BILINEAR);
        return moveCenterBack.filter(transform.filter(moveCenterToPointZero.filter(src,dst), dst), dst);
    }

我的想法是形式改变矩阵应该是单位矩阵(是正确的英语单词?),移动整个画面的向量是最后2个条目。我的解决方案首先使图片更大,然后再缩小(这并不重要 - 原因未知!!! )并且还会削减3/4左右的图片(重要的是 - 原因可能是图片移动到“从(0,0)到(宽度,高度)”图片尺寸的合理范围之外。

通过所有的数学,我没有受过如此训练,计算机所做的所有错误,以及其他一切都不能轻易进入我脑海中的错误,我不知道如何更进一步。请给出建议。我想围绕它的中心旋转图片,我想了解AffineTransformOp。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您可以转换为原点,旋转和翻译,如example所示。

当您使用AffineTransformOp时,此example可能更适合。特别要注意连接操作的 last-specified-first-applied 顺序;他们可交换。