Question

Je suis en train de lire ce tutoriel sur l'obtention de données de pixels de l'appareil photo de l'iPhone.

Alors que je n'ai pas de problème en cours d'exécution et à l'aide de ce code, j'ai besoin de prendre la sortie de la caméra de données (ce qui est BGRA) et de le convertir à ARGB pour que je puisse l'utiliser avec une bibliothèque externe.Comment dois-je faire?

Était-ce utile?

La solution

Si vous êtes sur iOS 5.0, vous pouvez utiliser vImage au sein de l'Accélérer la cadre de faire un NÉON de couleur optimisées composant de swap en utilisant le code suivant (tiré de Apple WebCore code source):

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, et srcBytesPerRow sont obtenus à partir de votre pixel buffer via CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), et CVPixelBufferGetBytesPerRow(). srcRows serait le pointeur vers l'adresse de base des octets du pixel de la mémoire tampon, et destRows serait mémoire allouée pour contenir la sortie RGB de l'image.

Ce devrait être beaucoup plus rapide que de simplement parcourir les octets et d'échanger sur les composants de la couleur.

Selon la taille de l'image, une même solution plus rapide serait de télécharger l'image à OpenGL ES, le rendu d'un simple rectangle avec cette texture, et l'utilisation glReadPixels() pour tirer vers le bas les valeurs RGBA.Encore mieux serait d'utiliser iOS 5.0 texture caches pour le téléchargement, où ce processus ne prend 1-3 ms pour un 720p image sur un iPhone 4.Bien sûr, en utilisant OpenGL ES signifie beaucoup plus de code de prise en charge de ce pull off.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top