Вопрос

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top