Frage

Ich lese dieses Tutorial beim Abrufen von Pixeldaten von der iPhone-Kamera.

Obwohl ich kein Problem damit habe, diesen Code auszuführen und zu verwenden, muss ich die Ausgabe der Kameradaten (die in BGRA enthalten sind) in ARGB konvertieren, damit ich sie mit einer externen Bibliothek verwenden kann.Wie mache ich das?

War es hilfreich?

Lösung

Wenn Sie iOS 5.0 verwenden, können Sie vImage innerhalb des Accelerate-Frameworks verwenden, um einen neonoptimierten Farbkomponententausch mit Code wie dem folgenden durchzuführen (gezeichnet von Apple WebCore Quellcode):

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);

wo width, height, und srcBytesPerRow werden aus Ihrem Pixelpuffer über erhalten CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), und CVPixelBufferGetBytesPerRow(). srcRows wäre der Zeiger auf die Basisadresse der Bytes im Pixelpuffer und destRows wäre Speicher, den Sie für das Ausgabe-RGBA-Bild zugewiesen haben.

Dies sollte viel schneller sein, als einfach über die Bytes zu iterieren und die Farbkomponenten auszutauschen.

Abhängig von der Bildgröße wäre eine noch schnellere Lösung, den Frame in OpenGL ES hochzuladen, ein einfaches Rechteck damit als Textur zu rendern und die RGBA-Werte mit glReadPixels () herunterzuziehen.Noch besser wäre es, die Textur-Caches von iOS 5.0 sowohl für den Upload als auch für den Download zu verwenden, wobei dieser Vorgang für einen 720p-Frame auf einem iPhone 4 nur 1-3 ms dauert.Natürlich bedeutet die Verwendung von OpenGL ES viel mehr unterstützenden Code, um dies zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top