我在閱讀this tutorial從iPhone相機獲取像素數據。將BGRA轉換爲ARGB
雖然我沒有運行和使用此代碼的問題,但我需要將相機數據的輸出(來自BGRA)並將其轉換爲ARGB,以便我可以將其與外部庫一起使用。我該怎麼做呢?
我在閱讀this tutorial從iPhone相機獲取像素數據。將BGRA轉換爲ARGB
雖然我沒有運行和使用此代碼的問題,但我需要將相機數據的輸出(來自BGRA)並將其轉換爲ARGB,以便我可以將其與外部庫一起使用。我該怎麼做呢?
如果你在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);
其中width
,height
和srcBytesPerRow
通過CVPixelBufferGetWidth()
,CVPixelBufferGetHeight()
和CVPixelBufferGetBytesPerRow()
從您的像素緩衝區獲得。 srcRows
將是指向像素緩衝區中字節基址的指針,而destRows
將是您分配用於保存輸出RGBA圖像的內存。
這應該比僅僅遍歷字節和交換顏色分量要快得多。
根據圖像大小,更快的解決方案是將幀上傳到OpenGL ES,渲染一個簡單的矩形作爲紋理,並使用glReadPixels()來下拉RGBA值。更好的做法是使用iOS 5.0的紋理緩存進行上傳和下載,這個過程對於iPhone 4上的720p幀只需要1-3毫秒。當然,使用OpenGL ES意味着需要更多的支持代碼這關閉。
你試過請求不同的格式嗎? – hooleyhoop
是的,我做過;看起來,至少對於最新的iOS而言,不幸的是,在請求32位ARGB格式時會引發異常。具體來說就是說ARGB不受支持。 –