2011-02-07 4 views
17

Je rencontre des problèmes pour afficher une rotation BufferedImage. Je pense que la rotation fonctionne très bien, mais je ne peux pas vraiment la dessiner à l'écran. Mon code:Rotation des instances 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(); 
    } 
} 

Cela ne fonctionne pas pour moi. Je ne pouvais pas trouver un moyen de dessiner le img2d tourné sur g.

EDIT: J'ai plusieurs objets qui sont dessinés sur g, donc je ne peux pas faire pivoter cela. Je dois être capable de faire tourner les choses individuellement.

Répondre

18

Je voudrais utiliser Graphics2D.drawImage(image, affinetranform, imageobserver).

L'exemple de code ci-dessous pivote et traduit une image au centre du composant. Ceci est une capture d'écran du résultat:

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 Comment éclairant. –

32

Peut-être que vous devriez essayer d'utiliser AffineTransform comme ceci:

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

Vous faites pivoter les graphiques pour dessiner dans votre image, pas l'image. C'est pourquoi vous ne voyez aucun effet. Appliquer la rotation des graphiques que vous peignez sur et dessine l'image rotation:

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

Cela attirera probablement pas tout à fait ce que vous attendez, la rotation tournera autour de l'origine des coordonnées. Pour que l'image soit tourner autour de son centre, vous devez appliquer une coordonnée traduction avant la rotation, par exemple:

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

Le Graphics2D Tutorial a quelques exemples.

+0

Je veux tourner la BufferedImage séparément puis dessiner avec les graphiques. J'ai d'autres choses sur l'objet Graphics qui ne devrait pas être tourné. –

+0

Vous pouvez annuler la transformation des graphiques après le dessin de l'image. – Durandal

+2

@Durandal Êtes-vous sûr que 'Graphics' a une méthode de rotation? Ou voulez-vous dire 'g2d.rotate()'? – user3437460