2010-05-21 17 views
6

Sto lavorando a un progetto e ho bisogno di calcolare qualcosa in base alle righe e alle colonne di un'immagine. È facile prendere i bit delle righe dell'immagine. Tuttavia, per prendere i bit di ogni colonna ho bisogno di trasporre l'immagine in modo che le colonne diventino righe.Come posso trasporre un'immagine in Assembly?

Sto usando un'immagine BMP come input. Quante righe X colonne sono in un'immagine BMP? Mi piacerebbe vedere uno pseudocodice o qualcosa anche se possibile.

+2

Quindi, sono curioso, perché dovresti fare una cosa del genere in assemblea? – WhirlWind

+0

Poiché si tratta di un progetto per un corso che sto prendendo in Assembly;) – Nick

+2

è necessario aggiungere il tag compiti a domande come questa, ma questo sembra abbastanza ragionevole, poiché è ad un livello elevato, e non ci stai chiedendo di fare i compiti per te. – WhirlWind

risposta

1

Varia. I BMP possono avere qualsiasi dimensione (fino a un limite) e possono anche essere in formati diversi (RBG a 32 bit, RBG a 24 bit, tavolozza a 16 bit, tavolozza a 8 bit, monocromatico a 1 bit) e così via .

Come per la maggior parte degli altri problemi, è consigliabile scrivere prima una soluzione nel linguaggio di alto livello di propria scelta e quindi convertire parti o tutto in ASM secondo necessità.

Ma sì, nella sua forma più semplice per questo compito, che sarebbe il formato RGB a 32 bit, la rotazione con alcuni multipli di 90 gradi sarà come la rotazione di un array 2D.

+0

Grazie Per Larsen. Ho un BMP con risoluzione 256x256 e 96 dpi e la profondità di bit è 24. Come posso conoscere il formato RGB dell'immagine? È la profondità del bit? – Nick

+0

Sì. 24bit = R 8, G 8, B 8. Tali BMP non supportano la trasparenza AFAIK, motivo per cui è 24 e non 32 bit. – Puppy

+0

Grazie DeadMG. Quindi è un RGB a 24 bit. – Nick

2

Sembra che si desideri eseguire una trasposizione di matrice che è leggermente diversa dalla rotazione. A rotazione, le righe possono diventare colonne, ma le righe o le colonne saranno in ordine inverso a seconda della direzione di rotazione. La trasposizione mantiene l'ordinamento originale delle righe e delle colonne.

Penso che l'utilizzo dell'algoritmo giusto sia molto più importante dell'utilizzo dell'assemblaggio o solo di C. La rotazione di 90 gradi o la trasposizione si riduce effettivamente al solo spostamento della memoria. La cosa più importante da considerare è l'effetto della cache di manca, se si utilizza un algoritmo ingenuo come questo:

for(int x=0; x<width; x++) 
{ 
    for(y=0; y<height; y++) 
     out[x][y] = in[y][x]; 
} 

Ciò causerà un sacco di cache di manca, perché si sta saltare nella memoria molto. È più efficiente utilizzare un approccio basato su blocchi. Google per "Transpose Matrix Transpose".

Un luogo in cui è possibile fare dei guadagni è usare le istruzioni SSE per spostare più di un pezzo di dati alla volta. Questi sono disponibili in assemblaggio e in C. Controllare anche this link. Circa a metà strada hanno una sezione sul calcolo di una trasposizione a matrice veloce.

edit: Ho appena visto il tuo commento che si sta facendo questo per una classe in assemblea in modo probabilmente si può ignorare la maggior parte di quello che ho detto. Immaginavo che stavi cercando di spremere le migliori prestazioni da quando stavi usando l'assemblaggio.

+0

Grazie mille Jason. Ho modificato la mia domanda e ho cambiato la rotazione in trasposizione. Sono d'accordo anche sull'efficienza. Vedrò cosa posso trovare al riguardo. – Nick