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.
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:
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);
}
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.
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.