Есть ли простой способ повернуть изображение вокруг его центра?Сначала я использовал 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 градусам (которые не могут быть правильно обработаны грехом () и 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.