Conversão de BGRA em ARGB
-
11-12-2019 - |
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?
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.