2012-07-28 85 views
-2

vImageConvert_RGB888toARGB8888vImagePermuteChannels_ARGB8888。首先將其從RGB24更改爲ARGB,因爲OPENGL ES不支持ARGB,因此需要將ARGB更改爲BGRA,其格式爲vImagePermuteChannels_ARGB8888。但是當數據需要改變的時候成本很高,那麼有更好的方法的人呢?謝謝!我的代碼是這樣的:如何在iOS上快速將RGB24轉換爲BGRA?我使用的

- (void)transformRGBToBGRA:(const UInt8 *)pict{ 
rgb.data = (void *)pict; 

vImage_Error error = vImageConvert_RGB888toARGB8888(&rgb,NULL,0,&argb,NO,kvImageNoFlags); 
if (error != kvImageNoError) { 
    NSLog(@"vImageConvert_RGB888toARGB8888 error"); 
} 

const uint8_t permuteMap[4] = {3,2,1,0}; 

error = vImagePermuteChannels_ARGB8888(&argb,&bgra,permuteMap,kvImageNoFlags); 
if (error != kvImageNoError) { 
    NSLog(@"vImagePermuteChannels_ARGB8888 error"); 
} 

free((void *)pict); 

} 
+0

你已經發布了這個,並得到了一個答案4滴答=爲什麼你再次發佈它?請參閱http://stackoverflow.com/q/11683864/96716 – 2012-07-28 14:22:33

+0

因爲我認爲它們不同,一個是BGR,另一個是BGRA,它們需要不同的內存容量。所以我想知道APPLE是否有更簡單的API來完成這項工作。 – zhzhy 2012-07-30 00:57:09

回答

0

現在我發現最快的解決方案是組裝。就像這樣:

__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 4 64-bit regs: \n" 
       "vst4.8  {d0,d1,d2,d3}, [%2]!  \n" 
       "subs  %1, %1, #1  \n" 
       "bne   0b   \n" 
       : 
       : "r"(img), "r"(numPixels24), "+r"(bgraData) 
       : "r6", "r7","r8" 
       ); 
相關問題