Загрузка красного компонента 24-битного растрового изображения в массив - PullRequest
0 голосов
/ 13 мая 2019

Предположим, у меня есть 200 x 200 пикс. 24-битное изображение BMP.
Я хочу загрузить красный компонент в массив с именем 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

Этот код загружает зеленый компонент.

Как я могу преобразовать его для работы на красном?

Также, я думаю, размер list не правильный.

1 Ответ

2 голосов
/ 13 мая 2019

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

...