Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JAVA] Ruotare immagine di 90 gradi

    Buongiorno,

    non credevo che ruotare un oggetto della classe Image in Java potesse prendere così tanto tempo a un inesperto come me.

    Posto il codice e lo commento:

    codice:
    img = img.getScaledInstance(600, 200 Image.SCALE_FAST);
    
                objBI = new BufferedImage(200, 600,  BufferedImage.TYPE_INT_RGB);
    
                g2 = objBI.createGraphics();
    
                g2.rotate(Math.toRadians(90), 600/2 , 200/2);
    
                g2.drawImage(img, -200, 200, null);
    Carico l'immagine con width e height volute,

    Creo un nuovo BufferedImage con le dimensioni scambiate, in modo da avere un immagine nera già ruotata.

    Ruoto l'immagine di 90 gradi: gli altri 2 elementi sono il punto di rotazione, che imposto come altezza / 2 e larghezza / 2.

    Poi faccio drawImage traslando l'immagine ottenuta.

    Però l'immagine non è MAI, e dico MAI, esattamente al centro del Buffer, che infatti risulta ancora in parte nero...

    Come faccio, a artire dal mio codice, a traslare la mia immagine di 90°?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Ruotare immagine di 90 gradi

    Originariamente inviato da ragnonerodocet
    Però l'immagine non è MAI, e dico MAI, esattamente al centro del Buffer, che infatti risulta ancora in parte nero...
    Evita l'uso del rotate(double theta, double x, double y). Se leggessi la documentazione vedresti che fa l'equivalente di 1 translate, 1 rotate poi 1 translate. Ed è più complesso in quanto cambia di più le cose (a dire il vero non ho mai pensato/capito bene a cosa possa servire realmente questo rotate particolare).

    Vuoi solo ruotare? Usa solo il rotate(double theta). Se vuoi ruotare di 90 gradi, ok il Math.toRadians ti dà i radianti. Ma devi tenere presente 2 cose:

    - L'origine del Graphics è in alto/sinistra.
    - Una rotazione di 90 gradi fa sì che gli assi diventino tali per cui l'asse Y si incrementa verso sinistra e l'asse X si incrementa verso il basso.

    Se tu, per dire, stampassi la immagine a (0,0) dopo la rotazione, non la "vedresti", perché sarebbe disegnata "fuori" dal componente nella zona a fianco del componente sulla sinistra (ruotata ovviamente).
    Quindi devi semplicemente portare la Y di disegno a -altezza_immagine.

    Detto in codice:

    g2.rotate(Math.toRadians(90));
    g2.drawImage(img, 0, -200, null);
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Risolto.

    Avevo letto la documentazione e avevo capito 2 cose:

    1) rotate (double theta, double x, double y) ruota l'immagine prendendo come centro della rotazione i parametri x e y.

    2) drawImage (Image img, double x, double y) "disegna l'immagine" prendendo come origine delle coordinate il punto (x, y).


    Allora avevo capito che l'immagine mi veniva stampata, mi veniva anche ruotata di 90 gradi, ma me la prendevo solo con il drawImage credendo che una traslazione di 200, -200 andasse bene.

    In realtà me la dovevo prendere anche con il rotate.

    Grazie 1000 andbin, le sai davvero tutte.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.