1

我有一个 JPEG 图像(比如大小为 10*10),我想对该 JPEG 图像的某些部分执行颜色转换。

例如,我想对从“1 到 10”列开始的图像宽度执行颜色转换。

在这种情况下,转换后的颜色与原始图像中的颜色不同,而是失真了。

虽然默认情况下,jpeg 图像颜色转换的 .c 实现是按像素完成的,因此从 1-10(而不是 0-10)执行颜色转换没有问题,

但是当我采用颜色转换的组装实现(它一次执行 8 个像素)并执行相同的任务时,图像会失真......(图像的最大部分看起来是绿色的)

颜色转换的汇编代码如下:

add             Y,  Y, START_X
add             U,  U, START_X
add             V,  V, START_X

只有上面的代码是我的补充

asm_function jsimd_ycc_\colorid\()_convert_neon
/* Outer loop over scanlines */
cmp             NUM_ROWS, #1
blt             9f

0:
ldr             Y, [INPUT_BUF0, INPUT_ROW, lsl #2]
ldr             U, [INPUT_BUF1, INPUT_ROW, lsl #2]

mov             N, OUTPUT_WIDTH
ldr             V, [INPUT_BUF2, INPUT_ROW, lsl #2]

add             Y,  Y, START_X
add             U,  U, START_X
add             V,  V, START_X

add             INPUT_ROW, INPUT_ROW, #1
ldr             RGB, [OUTPUT_BUF], #4

/* Inner loop over pixels */
subs            N, N, #8

blt             3f
do_load         8
do_yuv_to_rgb_stage1
subs            N, N, #8
blt             2f
1:
do_yuv_to_rgb_stage2_store_load_stage1
subs            N, N, #8
bge             1b
2:
do_yuv_to_rgb_stage2
do_store        \bpp, 8
tst             N, #7
beq             8f
3:
tst             N, #4
beq             3f
do_load         4
3:
tst             N, #2
beq             4f
do_load         2
4:
tst             N, #1
beq                5f
do_load         1
.endfunc
4

0 回答 0