LoginSignup
46
54

More than 5 years have passed since last update.

Androidでカメラ画像を取得する

Last updated at Posted at 2013-07-03

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を作成出来ないせい。

46
54
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
54