2010-11-11 48 views
7

Tôi đang tìm cách xoay hình ảnh. Tôi có số JInternalFrame có chứa JLabel. Nhãn chứa hình ảnh. Sau khi hình ảnh đã được xoay, tôi cần phải thay đổi kích thước khung bên trong. Mã tôi hiện đang xoay hình ảnh, nhưng có màu đen xung quanh các cạnh của hình ảnh và nó được căn giữa. Bất kỳ đề xuất về làm thế nào để sửa lỗi này?Xoay hình ảnh trong java

public void rotateIcon(int angle) 
{ 
     int w = theLabel.getIcon().getIconWidth(); 
     int h = theLabel.getIcon().getIconHeight(); 
     int type = BufferedImage.TYPE_INT_RGB; // other options, see api 

     BufferedImage DaImage = new BufferedImage(h, w, type); 
     Graphics2D g2 = DaImage.createGraphics(); 

     double x = (h - w)/2.0; 
     double y = (w - h)/2.0; 
     AffineTransform at = AffineTransform.getTranslateInstance(x, y); 

     at.rotate(Math.toRadians(angle), w/2.0, h/2.0); 
     g2.drawImage(new ImageIcon(getData()).getImage(), at, theLabel); 
     g2.dispose(); 

     theLabel.setIcon(new ImageIcon(DaImage)); 
     this.setSize(DaImage.getWidth(),DaImage.getHeight()); //resize the frame 
} 
+0

Nói chung, xoay một hình ảnh thay đổi chiều rộng và chiều cao (so với trục X và Y). Tôi đoán điều này đang góp phần làm cho nó bị "làm trung tâm". Tôi đã phải giải quyết điều này bằng cách tính toán kích thước mới và tính toán nó. Đối với các cạnh màu đen, đây là trường hợp khá phổ biến trong đó chức năng xoay không hoạt động với kênh alpha. Có lẽ điều này sẽ giúp cho việc định vị: http://stackoverflow.com/questions/2056338/calculating-the-center-of-rotation-after-translation – Jere

+1

Xem thêm http://stackoverflow.com/questions/3420651 – trashgod

Trả lời

15

Bạn cần phải sử dụng lượng giác để xác định chiều rộng/chiều cao chính xác, sử dụng tính minh bạch để ngăn chặn vùng màu đen và tôi cho rằng Biến đổi là sai, điều này làm cho trung tâm bị lệch.

Hãy thử điều này:

public static BufferedImage rotate(BufferedImage image, double angle) { 
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle)); 
    int w = image.getWidth(), h = image.getHeight(); 
    int neww = (int)Math.floor(w*cos+h*sin), newh = (int) Math.floor(h * cos + w * sin); 
    GraphicsConfiguration gc = getDefaultConfiguration(); 
    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT); 
    Graphics2D g = result.createGraphics(); 
    g.translate((neww - w)/2, (newh - h)/2); 
    g.rotate(angle, w/2, h/2); 
    g.drawRenderedImage(image, null); 
    g.dispose(); 
    return result; 
} 

private static GraphicsConfiguration getDefaultConfiguration() { 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice gd = ge.getDefaultScreenDevice(); 
    return gd.getDefaultConfiguration(); 
} 

từ http://flyingdogz.wordpress.com/2008/02/11/image-rotate-in-java-2-easier-to-use/

+0

Điều này thực sự tuyệt vời. Tôi có một vấn đề với nó mặc dù. Hình ảnh của tôi chỉ cần xoay 90 độ. tại một thời điểm. Nếu tôi vượt qua 90 cho góc, nó sẽ thực sự xoay hơn 90 độ – user489041

+1

Đây là sử dụng radian, vì vậy chỉ cần sử dụng Math.toRadians (độ) đầu tiên. –

+0

Làm việc như một sự quyến rũ. Cảm ơn! – user489041

0

Liệu nó giúp đỡ nếu bạn thay đổi:

BufferedImage DaImage = new BufferedImage(height, width, type);

tới:

BufferedImage DaImage = new BufferedImage(**width, height**, type);?

+0

Vâng, tôi đã chuyển đổi qua lại, vẫn không thành công. – user489041