1604


[android.media.ImageReader](https://developer.android.com/reference/android/media/ImageReader.html)クラスを使ってSurfaceに送った結果からBitmapを取り出したいのですが、OnImageAvailableListenerのコールバックでどのようにしたらBitmapが作成できるのでしょうか？  
ImageReader.acquireLatestImage()で取得できるImageのフォーマットはJPEGです。

[code]

    ImageReader.OnImageAvailableListener onImageAvailableListener =
      new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
          // Bitmap bitmap = doSomethingWith(reader);
        }
    };
    
[/code]

ちなみにcamera2 APIを使った静止画撮影での用途を想定しています。


CC BY-SA 3.0
2014-12-15T06:18:04.440
1598
2014-12-16T03:55:03.240
2014-12-15T13:48:00.990
33
450
question
android bitmap
ImageReaderからBitmapを取り出したい


ちょっとドキュメント読んだだけでなので自信ないですが、コードで書き下すと以下の様な手順になりそうです。

[code]

    Image image = reader.acquireLatestImage();
    Plane plane = image.getPlanes()[0];
    ByteBuffer buf = plane.getBuffer();
    byte[] b = buf.array();
    int off = buf.arrayOffset();
    Bitmap bitmap = BitmapFactory.decodeByteArray(b, off, b.length - off);
    
[/code]

ドキュメントを読み解くと、大まかな流れとしては以下のとおりになってるように見受けられました。

  1. Image から Plane を取り出して
  2. Plane から ByteBuffer を取り出して
  3. ByteBuffer の中身を BitmapFactory に食わせる

なお BitmapFactory を使うということは
[Image#getFormat](http://developer.android.com/reference/android/media/Image.html#getFormat\(\))
の説明のJPEGの箇所に書いてあったのを参考にしました。

もしかしたら
[ByteBuffer#array](http://developer.android.com/reference/java/nio/ByteBuffer.html#array\(\))
が失敗するかもしれませんが、その場合は
[ByteBuffer#get(byte[])](http://developer.android.com/reference/java/nio/ByteBuffer.html#get\(byte\[\]\))
を使って、以下のよう byte[] を取り出し、BitmapFactoryに渡せそうです。

[code]

    byte[] b = new byte[buf.remaining()];
    buf.get(b);
    BitmapFactory.decodeByteArray(b, 0, b.length);
    
[/code]

以上、外していたらごめんなさい。


CC BY-SA 3.0
2014-12-15T13:13:54.300
1604
2014-12-16T03:55:03.240
2014-12-16T03:55:03.240
450
208
1598
answer