2015-11-28 6 views
1

Мой код поворачивает изображение на 0,4 градуса каждое «обновление», изображение непрерывно вращается в диапазоне [-10, + 10]. Проблема в том, что буферизованное изображение обрезается по краям при повороте, похоже, что вращение изменяет размер, который требуется для буферизации, но размер никогда не обновляется, любые идеи, как я могу заставить его работать?BufferedImage отключается после вращения

protected double rotation = 0; 
    private double rotDir = 0.4; 

    private BufferedImage getRotatedSprite(){ 
     if(Math.abs(rotation)>10) 
      rotDir=rotDir*(-1); 
     rotation+=rotDir; 
     ImageIcon icon = new ImageIcon(bImage); 
     BufferedImage bImg = new BufferedImage(icon.getIconWidth(), 
        icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d= (Graphics2D)bImg.getGraphics(); 
     g2d.rotate(Math.toRadians(rotation), icon.getIconWidth()/2, icon.getIconHeight()/2); 
     g2d.drawImage(bImage, 0, 0, null); 
     return bImg; 
} 
    public void drawSprite(Graphics g) { 
     BufferedImage image = getRotatedSprite(); 

     if(customWidth != -1 && customHeight != -1){ 
      g.drawImage(image, (int)locX, (int)locY, customWidth, customHeight, this); 
    }else 
     g.drawImage(image, (int)locX, (int)locY, this); 
} 
+0

Если вы заинтересованы в математике, вы можете взглянуть на это [например] (http://stackoverflow.com/questions/20275424/rotating-image -с-AffineTransform/20280225 # 20280225) – MadProgrammer

ответ

2

кажется, что вращение изменяет размер, что BufferedImage

Да размер будет меняться в зависимости от угла поворота.

Возможно, вам будет проще использовать Rotated Icon. Он вращает вас и пересчитывает размер (при необходимости). Нет необходимости создавать новые BufferedImages, вы просто устанавливаете степень вращения.

Простой пример. Используйте панель slilder, чтобы повернуть изображение:

import java.awt.*; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import javax.swing.event.*; 

public class Rotation3 extends JPanel 
{ 
    private Icon icon; 
    private RotatedIcon rotated; 
    private int degrees; 

    public Rotation3(Image image) 
    { 
     icon = new ImageIcon(image); 
     rotated = new RotatedIcon(icon, 0); 
//  rotated.setCircularIcon(true); 
     setDegrees(0); 
     setPreferredSize(new Dimension(600, 600)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // translate x/y so Icon rotated around a specific point (300, 300) 

     int x = 300 - (rotated.getIconWidth()/2); 
     int y = 300 - (rotated.getIconHeight()/2); 
     rotated.paintIcon(this, g, x, y); 

     g.setColor(Color.RED); 
     g.fillOval(295, 295, 10, 10); 
    } 

    public void setDegrees(int degrees) 
    { 
     this.degrees = degrees; 
     rotated.setDegrees(degrees); 
     repaint(); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
//     String path = "dukewavered.gif"; 
        String path = "lunch75.jpg"; 
        BufferedImage bi = ImageIO.read(Rotation3.class.getResourceAsStream(path)); 
        final Rotation3 r = new Rotation3(bi); 

        final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0); 
        slider.addChangeListener(new ChangeListener() 
        { 
         public void stateChanged(ChangeEvent e) 
         { 
          int value = slider.getValue(); 
          r.setDegrees(value); 
         } 
        }); 

        JFrame f = new JFrame(); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f.add(new JScrollPane(r)); 
        f.add(slider, BorderLayout.SOUTH); 
        f.pack(); 
        f.setLocationRelativeTo(null); 
        f.setVisible(true); 
       } 
       catch(IOException e) 
       { 
        System.out.println(e); 
       } 
      } 
     }); 
    } 
} 
Смежные вопросы