повернуть изображение без изменения размера изображения в java

я пишу эти коды:

BufferedImage image;
BufferedImage im = image;

    @Override
    public void paint(Graphics g) {
    try {
        image = ImageIO.read(new File("jet.png"));
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(image, 100, 100, Color.BLACK, null);
        image = rotateImage(-45);
        g2.drawImage(image, 250, 100, Color.BLACK, null);
    } catch (IOException ex) {

    }
    }

    public BufferedImage rotateImage(int degress) {

    double deg = Math.toRadians(degress);
    double xrot = image.getWidth()/2 ;
    double yrot = image.getHeight() /2;
    AffineTransform xt = AffineTransform.getRotateInstance(deg, xrot, yrot);
    AffineTransformOp op = new AffineTransformOp(xt, AffineTransformOp.TYPE_BILINEAR);
    return op.filter(image, im);

    }
}

и вывод:

введите здесь описание изображения

и новый размер изображения изменен!!! я хочу повернуть это изображение, и его важный новый размер изображения не изменится

я хочу, чтобы какой-то код вращал изображение без изменения размера изображения, например

введите здесь описание изображения


person Hani Nakhli    schedule 03.07.2015    source источник
comment
вы можете заменить одно изображение другим изображением.   -  person Andrew Tobilko    schedule 03.07.2015
comment
@AndrewTobilko я хочу использовать только одно изображение !!!!   -  person Hani Nakhli    schedule 03.07.2015
comment
Вы пробовали библиотеку Scalr, она может поддерживать размер вашего изображения и вращать его. Но если изображение не квадратное, то, конечно, его размеры изменятся.   -  person We are Borg    schedule 03.07.2015
comment
@NaniNakhli, добавь ответ, хорошо?   -  person Andrew Tobilko    schedule 03.07.2015
comment
@AndrewTobilko в этой строке есть ошибка: GraphicsConfiguration gc = getDefaultConfiguration();   -  person Hani Nakhli    schedule 03.07.2015
comment
@AndrewTobilko Ой, снова изображение было изменено!   -  person Hani Nakhli    schedule 03.07.2015
comment
См. это   -  person Madhan    schedule 03.07.2015


Ответы (2)


Показанный эффект характерен для AffineTransformOp#filter(): "Координаты прямоугольника, возвращаемые getBounds2D(BufferedImage), не обязательно совпадают с координатами BufferedImage, возвращаемыми этим методом." Вместо этого нарисуйте изображение в BufferedImage с повернутым графическим контекстом, как показано здесь. Используйте RenderingHints, например VALUE_ANTIALIAS_ON и VALUE_INTERPOLATION_BILINEAR. , по мере необходимости.

person trashgod    schedule 03.07.2015
comment
это пример моего кода! мой код имеет 11 изображений для рисования, и я хочу повернуть одно из них - person Hani Nakhli; 04.07.2015
comment
Было бы проще, если бы вы сделали фон прозрачным, используя один из подходов, упомянутых здесь. - person trashgod; 04.07.2015

Прежде всего:

  1. Не переопределяйте paint(). Пользовательское рисование выполняется путем переопределения paintComponent(...) и не забывайте super.paintComponent(...) в начале метода.

  2. Не выполняйте ввод-вывод в методе рисования. Прочитать изображение в конструкторе класса

При повороте квадрата на угол, отличный от 90, 180, 270 и т. д., размер квадрата изменится. Итак, проблема заключается в используемой вами версии метода drawImage(...):

g2.drawImage(image, 100, 100, Color.BLACK, null);

Вместо того, чтобы использовать метод drawImage() для рисования фона и изображения, вы можете рисовать фон и изображение отдельно, чтобы вы могли контролировать размер фона:

//g2.drawImage(image, 100, 100, Color.BLACK, null);
g2.setColor( Color.BLACK );
g2.fillRect(100, 100, image.getWidth(), image.getHeight());
g2.drawImage(image, 100, 100, null);
image = rotateImage(-45);
g2.fillRect(250, 100, image.getWidth(), image.getHeight());
g2.drawImage(image, 250, 100, null);
person camickr    schedule 03.07.2015
comment
Спасибо за ваш ответ, я рисую фон, чтобы показать размер изображения! и исходное изображение важно, потому что я хочу использовать ‹code›image.getWidth()‹/code› и ‹code›image.getHeight()‹/code› в своем коде для другой работы! - person Hani Nakhli; 04.07.2015