повернуть картинку вокруг ее центра - PullRequest
1 голос
/ 20 апреля 2011

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

1 Ответ

2 голосов
/ 20 апреля 2011

Если я правильно понимаю ваш вопрос, вы можете перевести на исходное положение, повернуть и перевести обратно, как показано в этом примере .

Поскольку вы используете AffineTransformOp, этот пример может быть более подходящим. В частности, обратите внимание на порядок последний-указанный-первый-примененный , в котором операции объединяются; они не коммутативны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...