2011-02-07 19 views
17

Tôi gặp sự cố khi xoay một số BufferedImage để hiển thị. Tôi nghĩ rằng vòng quay hoạt động tốt, nhưng tôi không thể vẽ nó lên màn hình. Mã của tôi:Xoay các trường hợp 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(); 
    } 
} 

Điều này không hiệu quả đối với tôi. Tôi không thể tìm thấy cách nào để vẽ hình img2d xoay lên g.

EDIT: Tôi có nhiều đối tượng đang được vẽ lên g, vì vậy tôi không thể xoay mục đó. Tôi cần có khả năng xoay mọi thứ một cách riêng lẻ.

Trả lời

18

Tôi sẽ sử dụng Graphics2D.drawImage(image, affinetranform, imageobserver).

Ví dụ mã bên dưới quay và dịch hình ảnh vào giữa thành phần. Đây là một ảnh chụp màn hình của kết quả:

screenshot

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); 
} 
+0

@Squareoot Cách chiếu sáng. –

32

Có lẽ bạn nên thử sử dụng AffineTransform như thế này:

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); 

Hope this helps.

4

Bạn đang xoay đồ họa để vẽ vào hình ảnh của mình, không phải hình ảnh. Đó là lý do tại sao bạn thấy không có hiệu lực. Áp dụng xoay cho đồ họa bạn đang vẽ và nó sẽ vẽ hình ảnh được xoay:

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(); 
} 

Điều này có thể sẽ không vẽ hoàn toàn những gì bạn mong đợi, vòng quay sẽ xoay quanh gốc tọa độ. Đối với các hình ảnh được xoay quanh tâm của nó bạn cần phải áp dụng một dịch phối hợp trước khi luân chuyển, ví dụ:

g.translate(imgx >> 1, imgy >> 1); 

Các Graphics2D Tutorial có một số ví dụ khác.

+0

Tôi muốn xoay BufferedImage riêng và sau đó vẽ nó với Graphics. Tôi có những thứ khác trên đối tượng Đồ họa không nên xoay. –

+0

Bạn có thể hoàn tác việc chuyển đổi Đồ họa sau khi vẽ hình ảnh. – Durandal

+2

@Durandal Bạn có chắc 'Graphics' có phương pháp xoay không? Hay bạn có nghĩa là 'g2d.rotate()'? – user3437460

Các vấn đề liên quan