PDA

View Full Version : [JAVA] ruotare immagine di 90 gradi


Ciampa
22-05-2009, 17:22
salve,
mi servirebbe aiuto su come ruotare un immagine di 90 gradi; nel programma prendo in input un file.yuv (ogni pixel ha su 8 bit l'informazione del suo colore in scala di grigi; un vettore della dimensione della risoluzione dell'immagine immagazzina per ogni pixel il suo valore) e lo stampo su consolle usando caratteri cercanco di dare l'impressione dell'immagine. La consegna richiede anche di stampare un negativo dell'immagine e di ruotarla di 90 gradi: bisognerebbe ottenerlo usando un vettore d'appoggio, al quale vengono passati i pixel in modo da ruotare l'immagine di 90 gradi; ma il massimo che ho ottenuto è stata l'immagine ruotata di 90 gradi, ma poi anche simmetrizzata rispetto all'asse y. Qualcuno riesce a indicarmi il giusto algoritmo di passaggio tra i due vettori (da picture[] a picture90[]?

qui c'è un pezzo di codice: il primo metodo è la stampa normale, il secondo dovrebbe essere quella di rotazione.
if (risposta.compareTo("stampa") == 0)
for (int y=0; y<altezza; y++) {
for(int x=0; x<larghezza; x++) {
stampa (picture[(y*(int)altezza) + x]);
}
System.out.println();
}


else if (risposta.compareTo("ruota") == 0) {
int picture90[] = new int [(int)altezza * (int)larghezza];
for (int y=0; y<altezza; y++)
for(int x=0; x<larghezza; x++) {
picture90[(x*(int)larghezza)+y]=picture[y*(int)larghezza+x];
}

for (int y=0; y<altezza; y++) {
for(int x=0; x<larghezza; x++) {
stampa (picture90[(y*(int)altezza) + x]);
}
System.out.println();
}
}


l'intero progetto è disponibile qui (http://dl.getdropbox.com/u/614097/TLP_Es10_DIMP.zip)

ps: il nome del file da inserire è test.yuv
le dimensioni sono 64 x 64

Oceans11
22-05-2009, 19:52
Se questa è la stampa normale:

public static void stampa(int[][] v) {
for (int i = 0; i < v.length; i++) {
for (int j = 0; j < v[i].length; j++) {
System.out.print(v[i][j]);
}
System.out.println();
}
}


questa è la stampa ruotata:

public static void stampaRuotata(int[][] v) {
for (int i = 0; i < v.length; i++) {
for (int j = 0; j < v[i].length; j++) {
System.out.print(v[v.length - j - ][i]);
}
System.out.println();
}
}


Gli stessi cicli li puoi usare anche per copiare su un'altra matrice.

Ciampa
23-05-2009, 09:28
quindi dovrei rivdere il programma mettendo una matrice al posto del vettore ?

Oceans11
23-05-2009, 09:47
No! ti ho fatto proprio un esempio che ti dovrebbe mostrare come la rappresentazione grafica (la stampa a video) e la struttura interna dove è memorizzato l'oggetto sono abbastanza indipendenti!

Premettendo che non ho letto il codice dell'intero progetto, tu hai un vettore? beh però per visualizzare l'immagine devi stamparlo a mò di matrice giusto? E per visualizzare l'immagine ruotata basta che quando stampi "mischi" un pò gli indici ;)

Ciampa
23-05-2009, 10:23
scusa ma da un punto in poi non ti seguo: Ho capito che stampa su schermo e modo di immagazzinare i dati sono abbastanza indipendenti, ma non riesco a capire come applicare l'algoritmo hai postato al mio programma:

1. la tua funzione prendi cmq in ingresso una matrice int[][], io ho un vettore

2. nel mio programma, leggo ogni pixel dell'immagine e memorizzo nel vettore il suo valore da 0 a 255 in scala di grigi; la funzione stampa che vedi nel mio codice stampa '.', 'o', '*', 'A' a seconda che il valore sia più o meno alto, in modo da dare l'iilusione della sfumatura in bianco e nero

3. la trasformazione da applicare all'immagine sarebbe (considerando l'orientamento dell'asse y verso il basso)
x'=y
y'=larghezza -x
io ho già provato a mischiare gli indici, ma praticamente nella funzione sarei arrivato a
x'=y
y'=x
però non so come sistemare gli indici in modo corretto perchè ogni volta che ho provato mi dà errore, visto che esco dal limite del vettore

scusa la cocciutaggine :)