Проблема в том, что ваше исходное изображение не совсем квадратичное.Когда вы реализуете вращение AffineTransform с помощью at.rotate (-rad, width / 2, height / 2) ;, это то же самое, что и:
at.translate(width/2,height/2);
at.rotate(rads);
at.translate(-width/2,-height/2);
Итак, когда он выполняет последнюю строку, он переводитк происхождению.И если ширина больше y (или наоборот), то источник преобразования будет переведен на меньшее расстояние, чем сторона большей длины.
Например, если ваша ширина равна 30, а вашавысота равна 60, тогда исходная точка будет установлена как (-15, -30) от того места, где было установлено исходное преобразование.Таким образом, когда вы переводите его, скажем, на 90 градусов, изображение будет иметь ширину 60 и высоту 30, но в соответствии с исходной точкой исходное дно изображения будет нарисовано в (-30,0),поэтому он переполняет AffineTransform в -15 по оси X.Затем эта часть изображения будет обрезана.
Чтобы исправить это, вместо этого можно использовать следующий код:
double degreesToRotate = 90;
double locationX =bufferedImage.getWidth() / 2;
double locationY = bufferedImage.getHeight() / 2;
double diff = Math.abs(bufferedImage.getWidth() - bufferedImage.getHeight());
//To correct the set of origin point and the overflow
double rotationRequired = Math.toRadians(degreesToRotate);
double unitX = Math.abs(Math.cos(rotationRequired));
double unitY = Math.abs(Math.sin(rotationRequired));
double correctUx = unitX;
double correctUy = unitY;
//if the height is greater than the width, so you have to 'change' the axis to correct the overflow
if(bufferedImage.getWidth() < bufferedImage.getHeight()){
correctUx = unitY;
correctUy = unitX;
}
int posAffineTransformOpX = posX-(int)(locationX)-(int)(correctUx*diff);
int posAffineTransformOpY = posY-(int)(locationY)-(int)(correctUy*diff);
//translate the image center to same diff that dislocates the origin, to correct its point set
AffineTransform objTrans = new AffineTransform();
objTrans.translate(correctUx*diff, correctUy*diff);
objTrans.rotate(rotationRequired, locationX, locationY);
AffineTransformOp op = new AffineTransformOp(objTrans, AffineTransformOp.TYPE_BILINEAR);
// Drawing the rotated image at the required drawing locations
graphic2dObj.drawImage(op.filter(bufferedImage, null), posAffineTransformOpX, posAffineTransformOpY, null);
Надеюсь, это поможет.