risposta

6

È possibile iniziare dal codice di esempio Camera2Basic da Google.

È necessario aggiungere la superficie del ImageReader come un obiettivo alla richiesta di anteprima di cattura:

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

Dopo di che, è possibile recuperare l'immagine nel 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()); 
     } 
    } 
}; 

Per ottenere un Bitmap dal 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

congela la vista Textur. (MPreviewRequestBuilder.addTarget (mImageReader.getSurface());) – user1154390

4

Sì, utilizzare la classe ImageReader.

Creare un ImageReader utilizzando il formato ImageFormat.YUV_420_888 e le dimensioni desiderate (assicurarsi di selezionare una dimensione supportata dal dispositivo della fotocamera che si sta utilizzando).

Quindi utilizzare ImageReader.getSurface() per Surface per fornire a CameraDevice.createCaptureSession(), se presenti, eventuali altri output di anteprima.

Infine, nella richiesta di acquisizione ricorrente, aggiungi la superficie fornita da ImageReader come destinazione prima di impostarla come richiesta ripetuta nella sessione di cattura.

+0

@ Eddy Tal vala, quando aggiungo il target come mPreviewRequestBuilder.addTarget (mImageReader.getSurface()); Congela le superfici. – user1154390

+0

Quale errore si ottiene nel logcat? E hai aggiunto la superficie alla tua chiamata a createCaptureSession? –

+0

Sì, impostare entrambe le superfici per l'output in createCaptureSession. Logcat non mostra alcun errore. Si blocca in avanti ma rimane bloccato negli ultimi due giorni. – user1154390

Problemi correlati