我无法显示旋转的BufferedImage
。我认为旋转工作正常,但我实际上无法将其绘制到屏幕上。我的代码:
Class extends JPanel {
BufferedImage img;
int rotation = 0;
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
img2d = img.createGraphics();
img2d.rotate(Math.toRadians(rotation), img.getWidth() / 2, img.getHeight() / 2);
g.drawImage(img, imgx, imgy, null);
this.repaint();
}
}
这对我不起作用。我找不到任何方法将轮换的img2d
绘制到g
。
编辑:我有多个被绘制到g
的对象,所以我无法旋转它。我需要能够单独旋转。
答案 0 :(得分:33)
也许你应该尝试使用这样的AffineTransform
:
AffineTransform transform = new AffineTransform();
transform.rotate(radians, bufferedImage.getWidth()/2, bufferedImage.getHeight()/2);
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
bufferedImage = op.filter(bufferedImage, null);
希望这有帮助。
答案 1 :(得分:19)
我会使用Graphics2D.drawImage(image, affinetranform, imageobserver)。
下面的代码示例将图像旋转并转换为组件的中心。这是结果的屏幕截图:
public static void main(String[] args) throws IOException {
JFrame frame = new JFrame("Test");
frame.add(new JComponent() {
BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// create the transform, note that the transformations happen
// in reversed order (so check them backwards)
AffineTransform at = new AffineTransform();
// 4. translate it to the center of the component
at.translate(getWidth() / 2, getHeight() / 2);
// 3. do the actual rotation
at.rotate(Math.PI/4);
// 2. just a scale because this image is big
at.scale(0.5, 0.5);
// 1. translate the object so that you rotate it around the
// center (easier :))
at.translate(-image.getWidth()/2, -image.getHeight()/2);
// draw the image
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(image, at, null);
// continue drawing other stuff (non-transformed)
//...
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
答案 2 :(得分:4)
您正在旋转图形以绘制图像,而不是图像。这就是为什么你看不到任何影响。将旋转应用于您正在绘制的图形,它将绘制旋转的图像:
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
g.rotate(Math.toRadians(rotation), img.getWidth() / 2, img.getHeight() / 2);
g.drawImage(img, imgx, imgy, null);
this.repaint();
}
这可能无法完全按照您的预期绘制,旋转将围绕坐标原点旋转。要使图像围绕其中心旋转,您需要在旋转之前应用坐标平移,例如:
g.translate(imgx >> 1, imgy >> 1);
Graphics2D Tutorial还有更多例子。