Java2D - Как повернуть изображение и сохранить результат - PullRequest
3 голосов
/ 28 мая 2011

Я создаю игру, в которой некоторые объекты вращаются лицом к лицу, в которое они стреляют.Между съемками есть задержка, и я хочу, чтобы объект продолжал смотреть в том же положении, пока он не выстрелит снова.Я знаю, как загружать изображения, и я знаю, как вращать их, используя AffineTransform.Но при этом мне нужно вычислять поворот каждый раз, когда объект рисуется.

Поэтому мой вопрос заключается в том, как мне повернуть изображение и сохранить результат в новом изображении, которое будет отображаться?

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

как мне повернуть изображение и сохранить результат в новом изображении, которое будет отображаться?

Создать новый BufferedImage. Возьмите объект Graphics (через BufferedImage.getGraphics(). Нарисуйте повернутое изображение на этом буферизованном изображении и сохраните изображение в массиве или карте на основе его поворота (чтобы его было легко просматривать это когда вам это нужно).

2 голосов
/ 30 июня 2015

Преобразование Affline работает только с идеальными квадратами.Следующий код используется, чтобы взять любое изображение прямоугольника и правильно повернуть его.Чтобы сделать это, он выбирает центральную точку, которая в два раза больше длины, и обманывает библиотеку, чтобы считать изображение идеальным квадратом, затем выполняет вращение и сообщает библиотеке, где найти правильную верхнюю левую точку.Особые случаи в каждой ориентации происходят, когда дополнительное изображение, которое не существует, находится либо слева, либо сверху поворачиваемого изображения.В обоих случаях точка корректируется по разнице в более длинной стороне и более короткой стороне, чтобы получить точку в правильном верхнем левом углу изображения.ПРИМЕЧАНИЕ: оси x и y также вращаются вместе с изображением, поэтому, где width> height, корректировки всегда происходят на оси y, а где height> width, корректировки происходят на оси x.

private BufferedImage rotate(BufferedImage image, double _theta, int _thetaInDegrees) {

    AffineTransform xform = new AffineTransform();

    if (image.getWidth() > image.getHeight()) {
        xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getWidth());
        xform.rotate(_theta);

        int diff = image.getWidth() - image.getHeight();

        switch (_thetaInDegrees) {
            case 90:
                xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff);
                break;
            case 180:
                xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff);
                break;
            default:
                xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth());
                break;
        }
    } else if (image.getHeight() > image.getWidth()) {
        xform.setToTranslation(0.5 * image.getHeight(), 0.5 * image.getHeight());
        xform.rotate(_theta);

        int diff = image.getHeight() - image.getWidth();

        switch (_thetaInDegrees) {
            case 180:
                xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight());
                break;
            case 270:
                xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight());
                break;
            default:
                xform.translate(-0.5 * image.getHeight(), -0.5 * image.getHeight());
                break;
        }
    } else {
        xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getHeight());
        xform.rotate(_theta);
        xform.translate(-0.5 * image.getHeight(), -0.5 * image.getWidth());
    }

    AffineTransformOp op = new AffineTransformOp(xform, AffineTransformOp.TYPE_BILINEAR);

    return op.filter(image, null);
}
1 голос
/ 28 мая 2011

Попробуйте что-нибудь подобное для клонирования изображений:

BufferedImage source = new BufferedImage(50, 10, BufferedImage.TYPE_4BYTE_ABGR); 

BufferedImage target = new BufferedImage(50, 10, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D tg = target.createGraphics();

AffineTransform at = new AffineTransform();
at.rotate(2);

tg.drawImage(source, at, null);

П.С .: Не обращайте внимания на мой предыдущий ответ, я неправильно понял вопрос. К сожалению.

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