2011-05-08 90 views
1

我正在製作一個基本的Java應用程序,並試圖旋轉圖像。我寫了下面的快速方法Java旋轉圖像變成全黑色?

private Image rotate(double degs){ 
    ImageIcon img = new ImageIcon("src/inc/img/char_male.png"); 
    Image temp = new BufferedImage(img.getIconWidth(), img.getIconHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = (Graphics2D) temp.getGraphics(); 
    g2.rotate(Math.toRadians(degs)); 
    g2.drawImage(img.getImage(), 0, 0, Color.WHITE, null); 
    System.out.println("Rotating "+degs); 
    g2.dispose(); 
    return temp; 
} 

問題是,當我運行這一點,並重繪GUI,圖像變成純黑色。我在做BufferedImage創建時出了什麼問題?我改變使用一個JLabel重繪的GUI,

label.setIcon(new ImageIcon(rotate(90))); 

回答

5

您需要旋轉並同時轉換,這樣旋轉的中心是圖像的中心。 AffineTransform旋轉方法與Graphics2D旋轉方法一樣具有過載。對於例如,如果你嘗試,...

private Image rotate(double degs){ 
    ImageIcon img = new ImageIcon("src/inc/img/char_male.png"); // why an ImageIcon??? 
    Image temp = new BufferedImage(img.getIconWidth(), img.getIconHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = (Graphics2D) temp.getGraphics(); 
    g2.rotate(Math.toRadians(degs), img.getIconWidth()/2, img.getIconHeight()/2); // changed 
    g2.drawImage(img.getImage(), 0, 0, Color.WHITE, null); 
    System.out.println("Rotating "+degs); 
    g2.dispose(); 
    return temp; 
} 

對不起,這裏是更正後的代碼:

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class ImageRotate { 
    private static final String IMAGE_PATH = "src/yr2011/images/guitar_3406632_n.jpg"; 

    public static void main(String[] args) { 
     try { 
     BufferedImage image = ImageIO.read(new File(IMAGE_PATH)); 
     ImageIcon icon = new ImageIcon(image); 
     JOptionPane.showMessageDialog(null, new JLabel(icon)); 

     icon = new ImageIcon(rotate(image, 90)); 
     JOptionPane.showMessageDialog(null, new JLabel(icon)); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

    private static Image rotate(Image image, double degs) { 
     int width = image.getWidth(null); 
     int height = image.getHeight(null); 
     BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = temp.createGraphics(); 
     g2.rotate(Math.toRadians(degs), height/2, height/2); 
     g2.drawImage(image, 0, 0, Color.WHITE, null); 
     g2.dispose(); 
     return temp; 
    } 
} 
+0

nope,即使這是90度以外的度數是錯誤的,需要一個小三角來解決。去睡覺,但將在早上修復它! – 2011-05-08 05:42:26

2

我不使用Java,所以我不能告訴,如果有什麼問題與您的代碼,但做圖像旋轉旋轉出視口時常見的錯誤。當您將原始圖像想象爲座標原點時,將其旋轉90度會將圖像移動到x軸下方(或y軸的左側,取決於方向)。在這兩種情況下,旋轉的圖像都會離開視口,並且您會看到一個空的圖像。解決方案是將旋轉的圖像移回原處。

1

我有同樣的probleme和我解決它以另一種方式:

我的照片有一個透明的背景,但我不知道,因爲我一直期待它在白色背景。無論如何,我解決我的問題,當我使用的

BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_ARGB); 

代替

BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB); 

我認爲,與黑色背景Graphics2D的工作,如果你不這樣做精確的透明型。