Java 中的图像旋转
通过AffineTransform.getScaleInstance(double sx, double sy) 可以得到
一个执行旋转操作的AffineTransform 实例,再用它做参数,构造一
AffineTransformOp 对象,再调用其filter(BufferedImage src,BufferedImage dst)
方法,即可用来对BufferedImage做旋转变换。
但是,AffineTransformOp的filter方法,其返回的BufferedImage
的坐标,并
不一定与
getBounds2D(BufferedImage)
返回的矩形的坐标相同。如果矩形左上角的坐
标为负,
那部分就不会画出来。只有坐标非负的部分在目标BufferedImage中画出。
所以
单单直接
调用此函数做旋转变换,会使图像的一些部分丢失。必须使源图像在旋转后坐标都
非负,这
样才可以得到完全的图像。
可在做旋转之前,先对源图像做适当的平移,使源图像的坐标足够大,旋转之后都非负。
如图 3.2 所示,w, h 分别为源图像的宽,高。
旋转后恰好可以包含整个图像的竖直矩形尺
寸为:
Width = h * | sin(theta) | + w * | cos(theta) |.
Height = h * | cos(theta) | +w * | sin(theta) |,
图 . 图像旋转
这样,只要先做平移
[ 1 0 (Width-w)/2 ]
[ 0 1 (Height-h)/2 ]
[ 0 0 1 ]
即可。而这可通过AffineTransform.getTranslateInstance( (Width - wh)/2,( Height - h)/2 )
得到。