使用neon实现RGB888转RGB565
生活随笔
收集整理的這篇文章主要介紹了
使用neon实现RGB888转RGB565
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RGB888轉RGB565使用C代碼來實現是非常簡單的,但就是比較耗時,使用NEON很容易實現這個功能,而且速度還能有很大的提升,以下是將16個RGB888像素點轉為RGB565的代碼
uint8x16x3_t v = vld3q_u8(rgb);uint8x16_t r5 = vshrq_n_u8(v.val[0], 3);uint8x16_t g6 = vshrq_n_u8(v.val[1], 2);uint8x16_t b5 = vshrq_n_u8(v.val[2], 3);uint16x8_t temp = vshll_n_u8(vget_low_u8(r5), 8);uint16x8_t r5_l = vqshlq_n_u16(temp, 3);uint16x8_t g6_l = vshll_n_u8(vget_low_u8(g6), 5);uint16x8_t b5_l = vmovl_u8(vget_low_u8(b5));uint16x8_t rg56_l = vorrq_u16(r5_l, g6_l);uint16x8_t rgb565_l = vorrq_u16(rg56_l, b5_l);vst1q_u16(rgb565, rgb565_l);temp = vshll_n_u8(vget_high_u8(r5), 8);uint16x8_t r5_h = vqshlq_n_u16(temp, 3);uint16x8_t g6_h = vshll_n_u8(vget_high_u8(g6), 5);uint16x8_t b5_h = vmovl_u8(vget_high_u8(b5));uint16x8_t rg56_h = vorrq_u16(r5_h, g6_h);uint16x8_t rgb565_h = vorrq_u16(rg56_h, b5_h);vst1q_u16(rgb565 + 8, rgb565_h);在實現了這段代碼后,編譯的時候遇到了如下的報錯:
error:constant 11 out of range 0 - 8
編譯器并沒有能正確的指出錯誤的是哪一行代碼,后來發現是將R右移11位的操作
vshll_n_u8(vget_low_u8(r5), 11);
以上寫法會導致這個error,即右移的最大范圍是8,而這里要右移11。
所以這里拆成了兩次移位來實現右移11位。
NEON的右移位數是由限制的
總結
以上是生活随笔為你收集整理的使用neon实现RGB888转RGB565的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android ndk neon,And
- 下一篇: 公司用户画像项目总结