2012-05-18 4 views
4

iPhone 카메라에서 픽셀 데이터를 가져 오는 중 this tutorial을 읽습니다.BGRA를 ARGB로 변환

이 코드를 실행하고이 코드를 사용하는 동안 카메라 데이터 (BGRA로 제공됨)의 출력을 가져와 ARGB로 변환해야 외부 라이브러리와 함께 사용할 수 있습니다. 어떻게해야합니까? 당신이 아이폰 OS 5.0에 경우

+0

다른 형식을 요청 했습니까? – hooleyhoop

+0

예, 했어요. 최소한 최신 iOS의 경우 32 비트 ARGB 형식을 요청할 때 예외가 발생합니다. 특히 ARGB가 지원되지 않는다고 말하는 하나. –

답변

16

, 당신은이 (애플의 WebCore source code에서 도출) 다음과 같은 코드를 사용하여 NEON에 최적화 된 색상 구성 요소 스왑을 수행 할 가속화 프레임 워크 내에서 vImage를 사용할 수 있습니다

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을 , heightsrcBytesPerRowCVPixelBufferGetWidth(), CVPixelBufferGetHeight()CVPixelBufferGetBytesPerRow()을 통해 픽셀 버퍼에서 가져옵니다. srcRows은 픽셀 버퍼에있는 바이트의 기본 주소에 대한 포인터가되며 destRows은 출력 RGBA 이미지를 저장하기 위해 할당 한 메모리입니다.

이것은 단순히 바이트를 반복하고 색상 구성 요소를 교체하는 것보다 훨씬 빠릅니다.

이미지 크기에 따라 프레임을 OpenGL ES에 업로드하고이를 텍스처로 사용하여 간단한 사각형을 렌더링 한 다음 glReadPixels()을 사용하여 RGBA 값을 낮추는 것이 훨씬 더 빠른 솔루션입니다. 업로드와 다운로드 모두 iOS 5.0의 텍스처 캐시를 사용하는 것이 더 좋을 것입니다.이 프로세스는 iPhone 4의 720p 프레임에 대해 1 ~ 3 밀리 초 밖에 걸리지 않습니다. 물론 OpenGL ES를 사용하면 더 많은 지원 코드가 필요합니다. 이거.