获得正确的图像观察者来旋转图像

所以我画了一个BufferedImage’鸟’,但我想根据它落下的角度旋转它。 我有一个鸟对象,它包含BufferedImage和一个render()方法,它旋转绘制它。

public void render(Graphics2D g, ImageObserver io) { double theta = Math.tan((height - pastHeight) / .875); System.out.println(theta); Graphics2D g2 = (Graphics2D) bird.getGraphics(); g2.drawImage(bird, 100, (int) height, null); g2.rotate(theta); g2.drawImage(bird, 100, (int) height, io); } 

我这样称呼它

 bird.render(g2, ???); 

在我的jcomponent中的paintcomponent方法中。

唯一的问题是我不知道该使用什么作为我的ImageObserver …我已经尝试传递我的JFrame和我的JComponent但是当我这样做时图像不再出现…我会传递什么图像出现在我的窗口和/或我怎么能实现这种旋转?

假设你在扩展JComponent东西中这样做,你应该使用

 bird.render(g2, this); 

由于JComponent实现了ImageObserver

图像消失的问题不是ImageObserver的问题,而是旋转发生的点,我认为是Graphics上下文的左上角。

尝试使用Graphics2D#rotate(double, int, int) ,它允许您指定旋转的原点(轴点)。

不要忘记重置您的翻译,因为它们会影响您提供的所有内容,并可能在后续的绘画周期中重复使用。

更新了简单的示例

这是演示rotate的不同用法的基本示例。

首先,我只使用Graphics#rotate(double)

回转

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class RotateImage { public static void main(String[] args) { new RotateImage(); } public RotateImage() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private BufferedImage img; private double angel = 0d; public TestPane() { try { img = ImageIO.read(...); } catch (IOException ex) { ex.printStackTrace(); } Timer timer = new Timer(40, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { angel += 5; repaint(); } }); timer.start(); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (img != null) { Graphics2D g2d = (Graphics2D) g.create(); g2d.rotate(Math.toRadians(angel)); int x = (getWidth() - img.getWidth()) / 2; int y = (getHeight() - img.getHeight()) / 2; g2d.drawImage(img, x, y, this); g2d.dispose(); } } } } 

然后我换了g2d.rotate(Math.toRadians(angel));g2d.rotate(Math.toRadians(angel), getWidth() / 2, getHeight() / 2); ,使用组件的中心位置(或Graphics上下文)作为旋转发生的锚点…

中央

现在,因为您只想旋转图像,所以您需要计算图像中心位置当前位置周围的锚点(假设您希望它围绕中间旋转)