web-dev-qa-db-fra.com

Instances BufferedImage rotatives

J'ai du mal à afficher un BufferedImage pivoté à afficher. Je pense que la rotation fonctionne très bien, mais je ne peux pas réellement la dessiner à l'écran. Mon code:

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

Ça ne marche pas pour moi. Je n'ai trouvé aucun 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. J'ai besoin de pouvoir faire tourner les choses individuellement.

20
user577304

J'utiliserais Graphics2D.drawImage (image, affinetranform, imageobserver) .

L'exemple de code ci-dessous pivote et traduit une image au centre du composant. Voici 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);
}
19
dacwe

Vous devriez peut-être 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);

J'espère que cela t'aides.

34
Harry Joy

Vous faites pivoter les graphiques pour dessiner dans votre image, pas l'image. C'est pourquoi vous ne voyez aucun effet. Appliquez la rotation aux graphiques sur lesquels vous peignez et cela dessinera l'image pivotée:

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 ne dessinera probablement pas entièrement ce que vous attendez, la rotation tournera autour de l'origine des coordonnées. Pour que l'image pivote autour de son centre, vous devez appliquer une translation de coordonnées avant la rotation, par exemple:

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

Tutoriel Graphics2D a quelques autres exemples.

4
Durandal