2012-05-18 3 views
4

Я читаю this tutorial о получении данных о пикселях с камеры iPhone.Преобразование BGRA в ARGB

Хотя у меня нет проблем с запуском и использованием этого кода, мне нужно взять вывод данных камеры (который входит в BGRA) и преобразовать его в ARGB, чтобы я мог использовать его с внешней библиотекой. Как мне это сделать?

+0

Вы попробовали запросить другой формат? – hooleyhoop

+0

Да, я сделал; кажется, что, по крайней мере, для последней версии iOS, при запросе 32-разрядного формата ARGB, к сожалению, возникает исключение. В частности, это говорит о том, что ARGB не поддерживается. –

ответ

16

Если вы на прошивке 5.0, вы можете использовать vImage в убыстрениях рамок сделать NEON оптимизированного компонента цвета свопа с использованием коды, как показано ниже (взято из WebCore source code компании Apple):

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 для загрузки и загрузки, где этот процесс занимает всего 1-3 мс для кадра 720p на iPhone 4. Конечно, использование OpenGL ES означает гораздо более поддерживающий код для вытягивания это выключено.