Android のカメラ プレビュー データが NV21 (YUV 420) で返されることは十分に文書化されています。2.2 では、データをデコードするための YuvImage クラスが追加されました。私が遭遇した問題は、YuvImage クラスのデータが壊れているか正しくないように見えることです。ビットマップをモノクロ ビットマップに変換する HelloCompute という Renderscript サンプル アプリを使用しました。プレビュー データをビットマップにデコードし、Renderscript への入力として渡すために、次の 2 つの方法を使用しました。
方法 1 - Android YuvImage クラス:
YuvImage preview = new YuvImage(data, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream mJpegOutput = new ByteArrayOutputStream(data.length);
preview.compressToJpeg(new Rect(0, 0, width, height), 100, mJpegOutput);
mBitmapIn = BitmapFactory.decodeByteArray( mJpegOutput.toByteArray(), 0, mJpegOutput.size());
// mBitmapIn を RS に渡す
方法 2 - 投稿されたデコーダーの方法: David Pearlman によってここに 投稿されたとおり
// work around for Yuv format </p>
mBitmapIn = Bitmap.createBitmap(
ImageUtil.decodeYUV420SP(data, width, height),
width,
height,
Bitmap.Config.ARGB_8888);
// pass mBitmapIn to RS
画像が Renderscript によって処理され、表示されると、方法 1 は非常に粗く、モノクロではありませんが、方法 2 は予想される出力(プレビュー フレームのモノクロ画像) を生成します。私は何か間違ったことをしていますか、それとも YuvImage クラスは使用できませんか? 3.1 を実行している Xoom でこれをテストしています。
さらに、RS に渡す前に、両方の方法で生成されたビットマップを画面に表示しました。方法 1 のビットマップは照明に顕著な違いがあります (これは JPEG 圧縮によるのではないかと疑っています) が、方法 2 のビットマップはプレビュー フレームと同じです。