2

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 のビットマップはプレビュー フレームと同じです。

4

1 に答える 1

1

YUV 画像をグレースケール ビットマップに変換するためだけに Jpeg エンコード/デコードを使用する正当な理由はありません(結局のところ、白黒ビットマップではなくグレースケールが必要だと思います)。必要な結果を生成する多くのコード サンプルを見つけることができます。これを使用できます: Converting preview frame to bitmap

于 2011-10-10T09:12:45.013 に答える