有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为…
我的结果是这样的:
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)到(width,height)”的合理范围之外。
在所有数学方面,我并没有那么受过训练,计算机在计算时会犯所有错误,而其他所有无法轻易进入我脑海的东西,我都不知道该怎么做。请给个建议。我想绕图片中心旋转图片,我想了解AffineTransformOp。
如果我正确理解了您的问题,则可以转换为原点,旋转并向后平移,如本示例所示。
在使用时AffineTransformOp,此示例可能更合适。特别要注意的是,将操作串联在一起的 最后指定的先应用 顺序。它们 不是 可交换的。
AffineTransformOp