如何使用AffineTransform.quadrantRotate旋转位图?

我想围绕其中心点旋转位图 ,然后将其绘制到更大的图形上下文中

位图是40x40 pixels 。 图形上下文为500x500 pixels 。 这就是我正在做的事情:

 BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); AffineTransform at = new AffineTransform(); at.quadrantRotate(1, -20, -20); // rotate 90 degrees around center point. at.translate(100, 40); // I want to put its top-left corner at 100,40. g.drawImage(smallerBitmap, at, null); ... 

我可能错误地使用了quadrantRotate() – 如果我删除该行,我的图像至少会正确地在100,40位置绘制。

我究竟做错了什么?

谢谢

你的转变顺序很重要。 基本上你的示例代码是“将图像旋转90度然后翻译它……”

所以,使用你的代码(旋转,然后翻译)产生……

旋转不好

切换顺序(平移然后旋转)产生

旋转好

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; 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.JSlider; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class TestRotation100 { public static void main(String[] args) { new TestRotation100(); } public TestRotation100() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } final TestPane testPane = new TestPane(); final JSlider slider = new JSlider(0, 3); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { testPane.setQuad(slider.getValue()); } }); slider.setValue(0); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(testPane); frame.add(slider, BorderLayout.SOUTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private BufferedImage img; private int quad = 0; public TestPane() { try { img = ImageIO.read(new File("/Users/swhitehead/Dropbox/MegaTokyo/Rampage_Small.png")); } catch (IOException ex) { ex.printStackTrace(); } } public void setQuad(int quad) { this.quad = quad; repaint(); } @Override public Dimension getPreferredSize() { return new Dimension(400, 400); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); AffineTransform at = new AffineTransform(); at.translate(100, 40); at.quadrantRotate(quad, img.getWidth() / 2, img.getHeight() / 2); g2d.drawImage(img, at, this); g2d.dispose(); } } }