2010-05-21 28 views
6

Estoy trabajando en un proyecto y necesito calcular algo basado en las filas y columnas de una imagen. Es fácil tomar los bits de las filas de la imagen. Sin embargo, para tomar los bits de cada columna, necesito transponer la imagen para que las columnas se conviertan en filas.¿Cómo puedo transportar una imagen en ensamblaje?

Estoy usando una imagen BMP como entrada. ¿Cuántas filas X columnas hay en la imagen de BMP? Me gustaría ver un pseudocódigo o algo si es posible también.

+2

Entonces, tengo curiosidad, ¿por qué harías eso en el montaje? – WhirlWind

+0

Porque es un proyecto para un curso que estoy tomando en Asamblea;) – Nick

+2

debe agregar la etiqueta de tarea a preguntas como esta, pero parece bastante razonable, ya que es de alto nivel, y no nos está pidiendo que hagamos la tarea para ti – WhirlWind

Respuesta

1

Varía. Las BMP pueden tener cualquier tamaño (hasta un límite) y también pueden estar en diferentes formatos (RGB de 32 bits, RGB de 24 bits, paleta de 16 bits, paleta de 8 bits, monocromo de 1 bit), etc. .

Como con la mayoría de los demás problemas, lo mejor es escribir primero una solución en el lenguaje de alto nivel de su elección y luego convertir partes o todo en ASM según sea necesario.

Pero sí, en su forma más simple para esta tarea, que sería el formato RGB de 32 bits, rotar con algunos múltiplos de 90 grados será como rotar una matriz de 2-D.

+0

Gracias Per Larsen. Tengo un BMP con una resolución de 256x256 y 96 dpi y la profundidad de bits es 24. ¿Cómo puedo saber el formato RGB de la imagen? ¿Es la profundidad de bits? – Nick

+0

Sí. 24 bits = R 8, G 8, B 8. Dichos BMP no son compatibles con la transparencia AFAIK, razón por la cual es 24 y no 32 bits. – Puppy

+0

Gracias DeadMG. Entonces es un RGB de 24 bits. – Nick

2

Parece que quiere realizar una transposición de matriz que es un poco diferente a la rotación. En rotación, las filas pueden convertirse en columnas, pero las filas o las columnas estarán en orden inverso dependiendo de la dirección de rotación. La transposición mantiene el orden original de las filas y columnas.

Creo que usar el algoritmo correcto es mucho más importante que si usa ensamblaje o solo C. La rotación en 90 grados o la transposición realmente se reduce a solo mover la memoria. Lo más importante a tener en cuenta es el efecto de la caché se pierde si se utiliza un algoritmo ingenuo como esto:

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

Esto hará que una gran cantidad de memoria caché se pierde porque se está saltando en la memoria mucho. Es más eficiente usar un enfoque basado en bloques. Google para "transposición de matriz eficiente de caché".

Un lugar donde puede obtener algunas ventajas es usar las instrucciones SSE para mover más de un dato a la vez. Estos están disponibles en ensamblaje y en C. También consulte this link. Aproximadamente a mitad de camino tienen una sección sobre computación de una transposición de matriz rápida.

edición: Acabo de ver su comentario de que usted está haciendo esto para una clase en el montaje por lo que probablemente puede pasar por alto la mayor parte de lo que he dicho. Supuse que estabas buscando sacar el mejor rendimiento ya que estabas usando ensamblaje.

+0

Muchas gracias Jason. Edité mi pregunta y cambié la rotación a transposición. Estoy de acuerdo con la eficiencia también. Veré qué puedo encontrar al respecto. – Nick

Cuestiones relacionadas