假设我有一个 200 x 200 pix 24位BMP图片。
我想将 red 组件加载到名为list
的数组中。
image: .space 120054
list: .space 8160
# ... ... ...
LoadGreenComponentToList:
sub $sp, $sp, 4 #push $ra to the stack
sw $ra,4($sp)
la $t1, image + 10 #adress of file offset to pixel array
lw $t2, ($t1) #file offset to pixel array in $t2
li $t5, BMP_FILE_SIZE
sub $t5, $t5, $t2 # ?
div $t5, $t5, 3 # ?
la $t1, image # adress of bitmap
add $t2, $t1, $t2 # adress of pixel array in $t2
#fill the array with red values
add $t2, $t2, 1 # ?
li $t3, 0 # $t3 is the counter of loop
li $t4, 0
loop_through_pixels:
beq $t3, $t5, get_pixel_end
la $t6, list # $t6 = array address
mul $t4, $t3, 3 # $t4 = 3* $t3
add $t4, $t2, $t4 # $t4 = $t4 + $t2
lb $t1,($t4) # ?
#save to array
#sb $t1, ($t6)
#add $t6, $t6, 4
#inc array
mul $t1, $t1, 4 #or 4
add $t6, $t6, $t1
lw $t7, ($t6)
addi $t7, $t7, 1
sw $t7, ($t6)
add $t3, $t3, 1
j loop_through_pixels
get_pixel_end:
lw $ra, 4($sp) #restore (pop) $ra
add $sp, $sp, 4
jr $ra
此代码加载绿色组件。
如何将其转换为可以在Red上运行?
我还认为list
的大小不正确。
答案 0 :(得分:2)
假设它们存储为<red_byte><green_byte><blue_byte>
或<blue_byte><green_byte><red_byte>
,那么我想这是您的问题:
la $t1, image # adress of bitmap
add $t2, $t1, $t2 # adress of pixel array in $t2
#fill the array with red values
add $t2, $t2, 1 # ?
本质上,这与该伪代码等效:
PixelBuffer * buf = GetBitmap();
buf++;
突然之间,您突然不在像素缓冲区的底部(这是指向第二个字节),从而开始了像素迭代。
[r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b]
^ -- pointing here at the start of the loop
此行进一步向下:
mul $t4, $t3, 3 # $t4 = 3* $t3
add $t4, $t2, $t4 # $t4 = $t4 + $t2
这是3的跳跃-跳到每个下一个完整像素部分:
[r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b]
^ ------ ^ ------ ^ ------ ^ ------ ^ ------ ^ ------ ^
因此,在两种情况下的任何一种情况下(我都不记得像素数据以什么顺序存储在..中),请删除第一段代码:
########### REMOVED: add $t2, $t2, 1 # ?
...如果是RGB。或者,将其更改为此:
add $t2, $t2, 2 # ?
...如果是BGR。
我几乎可以肯定BMP是存储BGR的,因此选项2可能是正确的调用。