BGRAをargBに変換する
-
11-12-2019 - |
質問
refollow">このチュートリアルiPhoneカメラからピクセルデータを取得する。
このコードを使っていない間は、カメラデータ(BGRAに入ってきた)の出力を行い、それをARGBに変換して外部ライブラリと共に使用する必要があります。どうやってこれを行いますか?
解決
iOS 5.0では、Accelerate Framework内のvemageを使用して、次のようなコードを使用して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のテクスチャキャッシュを使用することでさえ、このプロセスはiPhone 4の720pフレームで1~3ミリ秒しかかかりません。もちろん、OpenGL ESを使用すると、より多くのサポートコードを引いてください。これは