2010-11-11 20 views
7

Ich bin auf der Suche nach einem Bild zu drehen. Ich habe eine JInternalFrame, die eine JLabel enthält. Das Etikett enthält das Bild. Nachdem das Bild gedreht wurde, muss die Größe des internen Rahmens geändert werden. Der Code, den ich gerade habe, dreht das Bild, aber es ist schwarz um die Ränder des Bildes und es ist außermittig. Irgendwelche Vorschläge, wie Sie das beheben können?Drehen Sie ein Bild in 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

Im Allgemeinen ändert sich ein Bild Drehen der Breite und der Höhe (bezogen auf X und Y-Achse). Ich schätze, das trägt dazu bei, dass es "dezentriert" ist. Ich musste das lösen, indem ich die neue Größe berechnete und dafür verantwortlich zeichnete. Was die schwarzen Ränder betrifft, ist dies ein ziemlich häufiger Fall, in dem die Drehfunktion nicht mit einem Alphakanal arbeitet. Vielleicht hilft das für die Positionierung: http://stackoverflow.com/questions/2056338/calculating-the-center-of-rotation-after-translation – Jere

+1

Siehe auch http://stackoverflow.com/questions/3420651 – trashgod

Antwort

15

Sie müssen Trigonometrie verwenden, um die richtige Breite/Höhe zu bestimmen, verwenden Sie Transparenz, um den schwarzen Bereich zu verhindern, und ich denke, die Transformation ist falsch, was es aus der Mitte macht.

Diese Versuchen:

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

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

+0

Das ist wirklich cool. Ich habe jedoch ein Problem damit. Mein Bild muss nur um 90 Grad gedreht werden. zu einer Zeit. Wenn ich 90 für den Winkel einlasse, wird es tatsächlich mehr als 90 Grad rotieren. – user489041

+1

Dies ist mit Radiant, also verwenden Sie zuerst Math.toRadians (Grad) zuerst. –

+0

Arbeitete wie ein Charme. Vielen Dank! – user489041

0

Hilft es, wenn Sie ändern:

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

zu:

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

+0

Ja, ich habe diese hin und her geschaltet, immer noch keinen Erfolg. – user489041