我尝试使用以下代码垂直翻转图像:
flipV:
ldr r0, =pic2
ldr r7, =#0x06800000 ;vram
ldr r1, =#0x18000 ;point do last byte
ldr r6, =#0x18000 ;counter
mov r5,#0
loop:
ldr r4,[r0,r5]
str r4,[r7,r1]
add r5,r5,#1
sub r1, r1,#1
subs r6, r6,#1
bne loop
bx lr
他取最后一个字节并换取第一个,最后一个 - 换掉第一个+ 1,依此类推。
我正在获取翻转图像,但是它被扭曲了。前
http://i.imgur.com/PKhxil2.png<<原版的 http://i.imgur.com/fCeOVdx.png<<翻转
有人可以帮我解决这个问题吗?我不知道为什么会这样。我刚开始学习图像处理。
答案 0 :(得分:1)
您的代码一次加载并存储4个字节。假设一个像素确实是4个字节,请尝试:
flipV:
ldr r0, =pic2
ldr r7, =#0x06800000 ;vram
ldr r1, =#0x17ffc ;point to last pixel
ldr r6, =#0x18000 ;counter
mov r5, #0
loop:
ldr r4, [r0, r5]
str r4, [r7, r1]
add r5, r5, #4
sub r1, r1, #4
subs r6, r6, #4
bne loop
bx lr
此外,这不是垂直翻转,而是图像旋转180度。
答案 1 :(得分:0)
根据输出文件的外观,我假设您的图像每像素存储1个字节,RGB平面分开存储。
您正在一次加载和存储4个字节,当您反转图像中32位字的顺序时,您不会反转字内字节的顺序,这会导致失真,发生在4像素宽的频带中。
这意味着像素按此顺序开始:
ABCD EFGH IJKL MNOP
但最终按此顺序排列:
MNOP IJKL EFGH ABCD
但你想按顺序排列它们:
PONM LKJI HGFE DCBA
在存储之前尝试使用rev
操作码来反转字节顺序:
ldr r4, [r0, r5]
rev r4, r4
str r4, [r7, r1]
根据斯科特的回答,你还需要每次增加/减少4次。