Предполагая, что они сохранены <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, вероятно, является правильным вызовом.