2012-05-18 96 views
4

我在閱讀this tutorial從iPhone相機獲取像素數據。將BGRA轉換爲ARGB

雖然我沒有運行和使用此代碼的問題,但我需要將相機數據的輸出(來自BGRA)並將其轉換爲ARGB,以便我可以將其與外部庫一起使用。我該怎麼做呢?

+0

你試過請求不同的格式嗎? – hooleyhoop

+0

是的,我做過;看起來,至少對於最新的iOS而言,不幸的是,在請求32位ARGB格式時會引發異常。具體來說就是說ARGB不受支持。 –

回答

16

如果你在iOS 5.0中,你可以使用VIMAGE的加速框架內使用如下(畫從蘋果公司的WebCore source code)代碼做了NEON優化的色彩分量互換:

vImage_Buffer src; 
src.height = height; 
src.width = width; 
src.rowBytes = srcBytesPerRow; 
src.data = srcRows; 

vImage_Buffer dest; 
dest.height = height; 
dest.width = width; 
dest.rowBytes = destBytesPerRow; 
dest.data = destRows; 

// Swap pixel channels from BGRA to RGBA. 
const uint8_t map[4] = { 2, 1, 0, 3 }; 
vImagePermuteChannels_ARGB8888(&src, &dest, map, kvImageNoFlags); 

其中widthheightsrcBytesPerRow通過CVPixelBufferGetWidth(),CVPixelBufferGetHeight()CVPixelBufferGetBytesPerRow()從您的像素緩衝區獲得。 srcRows將是指向像素緩衝區中字節基址的指針,而destRows將是您分配用於保存輸出RGBA圖像的內存。

這應該比僅僅遍歷字節和交換顏色分量要快得多。

根據圖像大小,更快的解決方案是將幀上傳到OpenGL ES,渲染一個簡單的矩形作爲紋理,並使用glReadPixels()來下拉RGBA值。更好的做法是使用iOS 5.0的紋理緩存進行上傳和下載,這個過程對於iPhone 4上的720p幀只需要1-3毫秒。當然,使用OpenGL ES意味着需要更多的支持代碼這關閉。

相關問題