日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用neon实现RGB888转RGB565

發布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。