我正在尝试使用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度后,结果如下:
答案 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);
}