旋转BufferedImage实例
我无法获得旋转的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
上的对象,所以我不能旋转。 我需要能够单独旋转的东西。
我会使用Graphics2D.drawImage(图像,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); }
也许你应该尝试像这样使用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);
希望这可以帮助。
您正在将graphics旋转到图像中,而不是图像。 这就是为什么你看不到任何效果。 将旋转应用于正在绘制的graphics,并将绘制旋转的图像:
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教程还有一些例子。