Istanze di Buffered BufferingImage

Sto riscontrando problemi nel visualizzare una BufferedImage ruotata. Penso che la rotazione funzioni bene, ma non riesco a disegnarla sullo schermo. Il mio codice:

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

Questo non funziona per me. Non ho trovato alcun modo per disegnare l’ img2d ruotato su g .

EDIT: ho più oggetti che vengono disegnati su g , quindi non posso ruotarlo. Devo essere in grado di ruotare le cose individualmente.

Vorrei usare Graphics2D.drawImage (image, affinetranform, imageobserver) .

L’esempio di codice seguente ruota e converte un’immagine al centro del componente. Questa è una schermata del risultato:

immagine dello schermo

  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-transformsd) //... } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); frame.setVisible(true); } 

Forse dovresti provare ad usare AffineTransform questo modo:

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

Spero che questo ti aiuti.

Stai ruotando la grafica per disegnare nella tua immagine, non l’immagine. Ecco perché non vedi alcun effetto. Applica la rotazione alla grafica su cui stai dipingendo e verrà disegnata l’immagine ruotata:

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

Questo probabilmente non attirerà interamente ciò che ti aspetti, la rotazione ruoterà attorno all’origine delle coordinate. Per ruotare l’immagine attorno al suo centro, è necessario applicare una traduzione di coordinate prima della rotazione, ad esempio:

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

Il tutorial di Graphics2D ha altri esempi.