2010-05-21 4 views
6

Ich arbeite an einem Projekt und ich muss etwas basierend auf den Zeilen und Spalten eines Bildes berechnen. Es ist einfach, die Bits der Bildzeilen zu übernehmen. Um jedoch die Bits jeder Spalte zu übernehmen, muss das Bild so transponiert werden, dass die Spalten zu Zeilen werden.Wie kann ich ein Bild in Assembly transponieren?

Ich verwende ein BMP-Bild als Eingabe. Wie viele Zeilen sind X-Spalten im BMP-Bild? Ich würde gerne einen Pseudocode oder etwas ähnliches sehen.

+2

Also, ich bin neugierig, warum würden Sie so etwas in der Montage tun? – WhirlWind

+0

Weil es ein Projekt für einen Kurs ist, den ich in Assembly mache;) – Nick

+2

sollten Sie das Hausaufgaben-Tag zu Fragen wie diesem hinzufügen, aber das scheint ziemlich vernünftig, da es auf einem hohen Niveau ist, und Sie fordern uns nicht zu tun die Hausaufgaben für dich. – WhirlWind

Antwort

1

Es variiert. BMPs können eine beliebige Größe haben (bis zu einem Grenzwert) und sie können auch in anderen Formaten vorliegen (32-Bit-RBG, 24-Bit-RBG, 16-Bit-Palette, 8-Bit-Palette, 1-Bit-Monochrom) und so weiter .

Wie bei den meisten anderen Problemen ist es am besten, zuerst eine Lösung in der Hochsprache Ihrer Wahl zu schreiben und dann Teile oder alles nach Bedarf in ASM zu konvertieren.

Aber ja, in seiner einfachsten Form für diese Aufgabe, die das 32-Bit-RGB-Format wäre, wird das Rotieren mit einem Vielfachen von 90 Grad wie das Drehen eines 2-D-Arrays sein.

+0

Danke Per Larsen. Ich habe ein BMP mit 256x256 Auflösung und 96 dpi und die Bittiefe ist 24. Wie kann ich das RGB-Format des Bildes wissen? Ist es die Bittiefe? – Nick

+0

Ja. 24bit = R 8, G 8, B 8. Solche BMPs unterstützen keine Transparenz AFAIK, weshalb es 24 und nicht 32 Bit ist. – Puppy

+0

Danke DeadMG. Es ist also ein 24-Bit RGB. – Nick

2

Es klingt, als ob Sie eine Matrix-Transponierung durchführen möchten, die ein wenig anders ist als die Rotation. In der Drehung können die Zeilen zu Spalten werden, aber entweder die Zeilen oder die Spalten sind in umgekehrter Reihenfolge, abhängig von der Drehrichtung. Die Transposition behält die ursprüngliche Reihenfolge der Zeilen und Spalten bei.

Ich denke, die Verwendung des richtigen Algorithmus ist viel wichtiger als ob Sie Assembly oder nur C verwenden. Die Drehung um 90 Grad oder Transposition läuft wirklich nur auf Bewegung Speicher. Die größte Sache zu prüfen, ist der Effekt der Cache verfehlt, wenn Sie einen naiven Algorithmus wie folgt verwenden:

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

Dies wird viele Cache verursachen verpasst, weil Sie um viel im Speicher springen. Es ist effizienter, einen blockbasierten Ansatz zu verwenden. Google für "Cache effiziente Matrix transponieren".

Ein Ort, an dem Sie möglicherweise einige Vorteile erzielen können, ist die Verwendung von SSE-Anweisungen, um mehr als ein Datenelement gleichzeitig zu verschieben. Diese sind in Montage und in C erhältlich. Schauen Sie auch this link. Etwa auf halbem Weg haben sie einen Abschnitt über die Berechnung einer schnellen Matrix-Transponierung.

edit: Ich sah nur Ihren Kommentar, dass Sie dies für eine Klasse in der Montage machen, so dass Sie wahrscheinlich die meisten außer Acht lassen kann, was ich sagte. Ich nahm an, Sie wollten die beste Leistung seit der Montage auspressen.

+0

Vielen Dank Jason. Ich habe meine Frage bearbeitet und die Rotation in Transposition geändert. Ich stimme auch der Effizienz zu. Ich werde sehen, was ich darüber finden kann. – Nick

Verwandte Themen