Andoroidでカメラアプリを作ろうと思うことはあると思う。
そのとき、SurfaceViewを使って、カメラのプレビュー画像を
表示するのはよくあると思われる。
ここで、プレビュー画像を取得しようと思ったら、めっちゃハマった。
まず、やろうとしたのは
・view.getDrawingCache()
でスクリーンショットを取得する方法。
結論だけ言うと失敗。カメラのプレビューは取得出来ないようだ。
その後、ネットの海をさまよった結果、
一番良さそうな方法は、PreviewCallback内の
onPreviewFrame(byte[] data, Camera camera) が
呼ばれたタイミングで、引数のbyte[] dataを使う方法。
参考:
http://tech.thecoolblogs.com/2013/02/get-bitmap-image-from-yuv-in-android.html
どうやるかというと、
1.引数dataから、YuvImageを作成する。
2.それをjpegに変換。
3.jpegをBitmapに変換する。
ソースは以下。
private PreviewCallback previewCallback = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// 読み込む範囲
int previewWidth = camera.getParameters().getPreviewSize().width;
int previewHeight = camera.getParameters().getPreviewSize().height;
// プレビューデータから Bitmap を生成
Bitmap bmp = getBitmapImageFromYUV(data, previewWidth, previewHeight);
// あとはBitmapを好きに使う。
}
public Bitmap getBitmapImageFromYUV(byte[] data, int width, int height) {
YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, width, height), 80, baos);
byte[] jdata = baos.toByteArray();
BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options();
bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length, bitmapFatoryOptions);
return bmp;
}
}
はじめにYuvImageを作成するのは、onPreviewFrameに渡されるdataが
RGBではなくYUB形式なので、そのままではBitmapを作成出来ないせい。