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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 转换BGR24 为 RGB24

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 转换BGR24 为 RGB24 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為了適應(yīng)多平臺,也是滿足跨平臺的要求,有時候必須轉(zhuǎn)換。因為rgb像素在windows上是按照BGRBGR這樣的順序存儲的,而在OS X上則是按照RGBRGB存儲。所以如果不做轉(zhuǎn)換,必然在某個平臺上出現(xiàn)色差。這里主要演示如何在OS X上實現(xiàn)這種轉(zhuǎn)換。

1.第一種方法最為簡單也最慢,就是寫一個循環(huán),交換R和B的位置。

Uint8 tmpValue = 0; for(int i = 0; i < numOfPixels; i+=3) {tmpValue = pixelBuffer[i];pixelBuffer[i] = pixelBuffer[i + 2];pixelBuffer[i + 2] = tmpValue; }

2.第二種相當(dāng)快了,使用accelerate.framwork,不過一個較大的限制是最低系統(tǒng)版本要求iOS5,所以使用范圍受到了限制。但是不考慮兼容性的話性能提升還是很厲害的。

- (void)transformRGBToBGR:(const UInt8 *)pict {rgb.data = (void *)pict;vImage_Error error = vImageConvert_RGB888toPlanar8(&rgb,&red,&green,&blue,kvImageNoFlags);if (error != kvImageNoError) {NSLog(@"vImageConvert_RGB888toPlanar8 error");}error = vImageConvert_Planar8toRGB888(&blue,&green,&red,&bgr,kvImageNoFlags);if (error != kvImageNoError) {NSLog(@"vImageConvert_Planar8toRGB888 error");}free((void *)pict);}

這里首先將內(nèi)存分布為BGR的數(shù)據(jù)轉(zhuǎn)換為平面數(shù)據(jù),需要三個同原始圖像一樣寬高的緩沖區(qū)存儲解析出的R/G/B數(shù)據(jù),接下來就可以使用vImageConvert_Planar8toRGB888隨意重組他們的順序,當(dāng)然要合理,如果你胡亂重組排序的,整合出來的圖像肯定是不對的。

由于vImageConvert_Planar8toRGB888和vImageConvert_RGB888toPlanar8都是使用neon匯編優(yōu)化過的,所以速度很快,幾乎已經(jīng)達(dá)到極限了。但是仔細(xì)觀察,可能就會發(fā)現(xiàn),這種方式需要同樣大小的較多的額外存儲,尤其是這種函數(shù)作為核心函數(shù)被調(diào)用的次數(shù)相當(dāng)高,導(dǎo)致頻繁的分配和釋放內(nèi)存,因而造成內(nèi)存碎片,影響系統(tǒng)系能。因此,這里就引出了終極解決方案。

3.最快的且節(jié)能內(nèi)存的就是這種方法了,即直接使用neon匯編編寫,而不是調(diào)用第三方的函數(shù)來完成。當(dāng)數(shù)據(jù)量較大時,頻繁的復(fù)制和移動數(shù)據(jù)廢除耗時,而這種方案就可以避免這個問題。相比第二種方法,這種方法節(jié)約了2ms,你可能會說,看上去并不是很明顯。可是當(dāng)你了解了CPU的主頻也就900MHZ時,你就知道提升不小了。

- (void) neon_asm_convert_BGR_TO_RGB:(UInt8 *) img numPixel:(int) numPixels24 {// numPixels is divided by 24__asm__ volatile("0: \n""# load 3 64-bit regs with interleave: \n""vld3.8 {d0,d1,d2}, [%0] \n""# swap d0 and d2 - R and B\n""vswp d0, d2 \n""# store 3 64-bit regs: \n""vst3.8 {d0,d1,d2}, [%0]! \n""subs %1, %1, #1 \n""bne 0b \n":: "r"(img), "r"(numPixels24): "r4", "r5"); }

第三種解決方案引自http://stackoverflow.com/questions/11683864/on-ios-how-to-quickly-convert-rgb24-to-bgr24

轉(zhuǎn)載于:https://www.cnblogs.com/CoderPlace/archive/2012/07/30/2615793.html

總結(jié)

以上是生活随笔為你收集整理的iOS 转换BGR24 为 RGB24的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。