Pergunta

eu estou lendo este tutorial sobre como obter dados de pixel da câmera do iPhone.

Embora não tenha problemas para executar e usar esse código, preciso pegar a saída dos dados da câmera (que vem em BGRA) e convertê-la em ARGB para poder usá-la com uma biblioteca externa.Como eu faço isso?

Foi útil?

Solução

Se você estiver no iOS 5.0, poderá usar vImage na estrutura Accelerate para fazer uma troca de componentes de cores otimizada para NEON usando código como o seguinte (extraído do site da Apple Código-fonte do WebCore):

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);

onde width, height, e srcBytesPerRow são obtidos do seu buffer de pixels via CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), e CVPixelBufferGetBytesPerRow(). srcRows seria o ponteiro para o endereço base dos bytes no buffer de pixel, e destRows seria a memória que você alocou para armazenar a imagem RGBA de saída.

Isso deve ser muito mais rápido do que simplesmente iterar os bytes e trocar os componentes de cores.

Dependendo do tamanho da imagem, uma solução ainda mais rápida seria fazer upload do quadro para OpenGL ES, renderizar um retângulo simples com isso como textura e usar glReadPixels() para baixar os valores RGBA.Melhor ainda seria usar os caches de textura do iOS 5.0 para upload e download, onde esse processo leva apenas de 1 a 3 ms para um quadro de 720p em um iPhone 4.É claro que usar OpenGL ES significa muito mais código de suporte para realizar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top