2016-04-04 2 views
1

Я пытаюсь повернуть буферизованный Image и вернуть буферизованное Image (повернутое изображение) с использованием метода getImage(). Вращение изображения происходит, но при сохранении оно сохраняет изображение как таковое без поворота изображения.Как сохранить повернутое буферизованное изображение в другом буферизованном изображении?

Инициализация:

private BufferedImage transparentImage; 

PaintComponent:

AffineTransform at = new AffineTransform(); 
at.rotate(Math.toRadians(RotationOfImage.value)); 
Graphics2D g2d = (Graphics2D) g; 

g2d.drawImage(transparentImage, at, null); 
repaint(); 

Способ вернуть повернутый буферизованного изображение.

public BufferedImage getImage(){ 
    return transparentImage; 
} 
+1

Почему вы вращаете его в 'paintComponent'? Вы должны нарисовать повернутое изображение. Выполнение этого так, как вы, не повлияет на изображение, поскольку вы вращаете контекст «Graphics» компонента – MadProgrammer

ответ

2

В принципе, вы вращая Graphics контекст компонента и живописи изображение на нем, что не будет иметь никакого влияния на исходное изображение.

Вместо этого, вы должны повернуть изображение и его картина, к примеру ...

public BufferedImage rotateImage() { 
    double rads = Math.toRadians(RotationOfImage.value); 
    double sin = Math.abs(Math.sin(rads)); 
    double cos = Math.abs(Math.cos(rads)); 

    int w = transparentImage.getWidth(); 
    int h = transparentImage.getHeight(); 
    int newWidth = (int) Math.floor(w * cos + h * sin); 
    int newHeight = (int) Math.floor(h * cos + w * sin); 

    BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = rotated.createGraphics(); 
    AffineTransform at = new AffineTransform(); 
    at.translate((newWidth - w)/2, (newHeight - h)/2); 

    at.rotate(Math.toRadians(RotationOfImage.value), w/2, h/2); 
    g2d.setTransform(at); 
    g2d.drawImage(transparentImage, 0, 0, this); 
    g2d.setColor(Color.RED); 
    g2d.drawRect(0, 0, newWidth - 1, newHeight - 1); 
    g2d.dispose(); 
} 

Тогда вы могли бы нарисовать его делать что-то вроде ...

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g.create(); 
    BufferedImage rotated = rotateImage(); 
    int x = (getWidth() - rotated.getWidth())/2; 
    int y = (getHeight() - rotated.getHeight())/2; 
    g2d.drawImage(rotated, x, y, this); 
    g2d.dispose(); 
} 

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

ps- Я не тестировал это, но он основан на этом question

+0

* «ps- Я не тестировал это ...» * Pfft .. сколько раз вы это сделали? Я уверен, что могу вспомнить, что ** хотя бы ** 3 раза на этом сайте (и у меня плохой памяти). –

+0

@AndrewThompson Поскольку я скопировал алгоритм из кода библиотеки, можно надеяться, что он будет работать: P – MadProgrammer

+0

Meh .. BNI ... ;-) –

Смежные вопросы