我正在尝试旋转一堆 BufferedImage 实例,旋转有效,但奇怪的是它们改变了位置。这是我如何做到这一点的一个片段。
BufferedImage philo1=ImageIO.read(new File("D:\\philo1.png"));
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
AffineTransform old = g2d.getTransform();
g2d.rotate(Math.toRadians(15),philo1.getWidth()/2,philo1.getHeight()/2);
g.drawImage(philo1,172, 48, 50, 50,this);
g2d.setTransform(old);
}
结果是这样的(有旋转和没有旋转):
这可能是什么原因造成的?我怀疑原因是我在绘制图像时强制调整图像的大小,这就是为什么它在不同的位置绘制它,因为我在绘制之前调用旋转方法。如果出现这种情况,该如何解决?
最佳答案
基本问题是,如果图像是从上下文的左上角 (0x0) 绘制的,则您试图围绕图像的中心点旋转整个 Graphics
上下文,但图像有偏移。
因为在虚拟空间中旋转图像非常有趣,所以我更喜欢生成一个在其自身上下文中旋转的新图像,然后简单地绘制它。对于 example
如果这看起来工作量很大,那么您需要首先翻译 Graphics
上下文,使左上角/左上角是要绘制图像的位置,然后您'将能够围绕图像的中心/ anchor 简单旋转图像,例如:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TestPane extends JPanel {
private BufferedImage img;
private double rotationByDegrees = 45.0;
public TestPane() throws IOException {
img = ImageIO.read(new File("/Users/shanewhitehead/Downloads/L05HK.png"));
}
@Override
public Dimension getPreferredSize() {
return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - img.getWidth()) / 2;
int y = (getHeight() - img.getHeight()) / 2;
g2d.translate(x, y);
g2d.rotate(Math.toRadians(rotationByDegrees), img.getWidth() / 2, img.getHeight() / 2);
g2d.drawImage(img, 0, 0, this);
g2d.dispose();
}
}
}
}
注意:您还可以使用 AffineTransform
,但我只是保持简单
关于java - 旋转 BufferedImage 会导致其位置发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47025104/