Преобразование BGRA в ARGB

Я читаюэтот урок на получение данных пикселей с камеры iPhone.

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

 hooleyhoop18 мая 2012 г., 17:01
Вы пытались запросить другой формат?
 Dany Joumaa18 мая 2012 г., 17:05
Да, я сделал; кажется, что, по крайней мере, для последней iOS, к сожалению, возникает исключение при запросе 32-битного формата ARGB. В частности, тот, который говорит, что ARGB не поддерживается.

Ответы на вопрос(1)

Решение Вопроса

вы можете использовать vImage в рамках инфраструктуры Accelerate, чтобы выполнить NEON-оптимизированную замену компонентов цвета с использованием кода, подобного следующему (взято из Apple).Исходный код 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);

гдеwidth, height, а такжеsrcBytesPerRow получены из вашего пиксельного буфера черезCVPixelBufferGetWidth(), CVPixelBufferGetHeight(), а такжеCVPixelBufferGetBytesPerRow(). srcRows будет указатель на базовый адрес байтов в пиксельном буфере, иdestRows будет память, выделенная для хранения выходного изображения RGBA.

Это должно быть намного быстрее, чем просто перебирать байты и менять цветовые компоненты.

В зависимости от размера изображения, еще более быстрым решением было бы загрузить кадр в OpenGL ES, визуализировать простой прямоугольник с этим в качестве текстуры и использовать glReadPixels () для сброса значений RGBA. Еще лучше было бы использовать кэши текстур iOS 5.0 для загрузки и выгрузки, где этот процесс занимает всего 1-3 мс для кадра 720p на iPhone 4. Конечно, использование OpenGL ES означает гораздо больше поддержки кода для потяните это от.

Ваш ответ на вопрос