iPhone 카메라에서 픽셀 데이터를 가져 오는 중 this tutorial을 읽습니다.BGRA를 ARGB로 변환
이 코드를 실행하고이 코드를 사용하는 동안 카메라 데이터 (BGRA로 제공됨)의 출력을 가져와 ARGB로 변환해야 외부 라이브러리와 함께 사용할 수 있습니다. 어떻게해야합니까? 당신이 아이폰 OS 5.0에 경우
iPhone 카메라에서 픽셀 데이터를 가져 오는 중 this tutorial을 읽습니다.BGRA를 ARGB로 변환
이 코드를 실행하고이 코드를 사용하는 동안 카메라 데이터 (BGRA로 제공됨)의 출력을 가져와 ARGB로 변환해야 외부 라이브러리와 함께 사용할 수 있습니다. 어떻게해야합니까? 당신이 아이폰 OS 5.0에 경우
, 당신은이 (애플의 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
을 , 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가 지원되지 않는다고 말하는 하나. –