私はカメラのpreviewCallbackを使って画像を取得しようとしています。私が使用しているコードは次のとおりです。
private Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback()
{
public void onPreviewFrame( byte[] data, Camera Cam ) {
Log.d("CombineTestActivity", "Preview started");
Log.d("CombineTestActivity", "Data length = "
+ data.length );
currentprev = BitmapFactory.decodeByteArray( data, 0,
data.length );
if( currentprev == null )
Log.d("CombineTestActivity", "currentprev is null" );
Log.d("CombineTestActivity", "Preview Finished" );
}
};
データの長さは常に 576000 と同じになります。
また、カメラのパラメータを変更して、画像が異なる形式で返されるようにしてみました。その場合、次のようになります。
mCamera = Camera.open();
camParam = mCamera.getParameters();
camParam.setPreviewFormat( ImageFormat.RGB_565 );
mCamera.setParameters( camParam );
mCamera.setPreviewCallback( mPrevCallback );
しかし、プレビュー形式を変更した場合も、デフォルトのNV21のままにした場合も、BitmapFactory.decodeByteArrayはnullとして返されます。プレビュー形式をJPEGタイプに変更することも試しました。ddmsにデバッグステートメントも表示されます。
「D/skia (14391): --- SkImageDecoder::Factory が null を返しました」
ベストアンサー1
わかりました。これが役に立つといいのですが。
迅速な解決策を探してインターネットをくまなく調べ、完璧なものを見つけました。
これはAndroid 2.1以降で動作します
off3nsiv3さんに感謝しますこのページ。
// Convert to JPG
Size previewSize = camera.getParameters().getPreviewSize();
YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);
byte[] jdata = baos.toByteArray();
// Convert to Bitmap
Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
off3nsiv3 のコードを少し変更するだけで準備完了です。手動デコードと比較すると、FPS は依然として非常に高いです。
上記のコードでは、80 は jpeg 品質です (0 から 100、100 が最高)。