回答

6

您可以從Google的Camera2Basic示例代碼開始。

您需要將ImageReader的表面添加爲目標,以預覽捕獲請求:

//set up a CaptureRequest.Builder with the output Surface 
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
mPreviewRequestBuilder.addTarget(surface); 
mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); 

之後,您可以檢索在ImageReader.OnImageAvailableListener圖像:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader reader) { 
     Image image = null; 
     try { 
      image = reader.acquireLatestImage(); 
      if (image != null) { 
       ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
       Bitmap bitmap = fromByteBuffer(buffer); 
       image.close(); 
      } 
     } catch (Exception e) { 
      Log.w(LOG_TAG, e.getMessage()); 
     } 
    } 
}; 

要獲得a Bitmap來自ByteBuffer

Bitmap fromByteBuffer(ByteBuffer buffer) { 
    byte[] bytes = new byte[buffer.capacity()]; 
    buffer.get(bytes, 0, bytes.length); 
    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
} 
+0

它凍結了Textureview。 (mPreviewRequestBuilder.addTarget(mImageReader.getSurface());) – user1154390 2015-12-19 12:54:31

4

是的,使用ImageReader類。

使用ImageFormat.YUV_420_888格式和您想要的尺寸創建一個ImageReader(請確保選擇了您使用的相機設備支持的尺寸)。

然後使用ImageReader.getSurface()爲Surface提供CameraDevice.createCaptureSession()以及其他預覽輸出(如果有)。

最後,在您的重複捕獲請求中,將ImageReader提供的表面添加爲目標,然後將其設置爲捕獲會話中的重複請求。

+0

@ Eddy Tal當我像mPreviewRequestBuilder.addTarget(mImageReader.getSurface())添加目標時;它凍結了表面。 – user1154390 2015-12-19 14:20:03

+0

你在logcat中遇到什麼錯誤?你是否將表面添加到createCaptureSession調用中? – 2015-12-20 18:34:57

+0

是爲createCaptureSession中的輸出設置兩個表面。 Logcat不顯示任何錯誤。它直接鎖定,但從前兩天卡住。 – user1154390 2015-12-20 18:55:16