2015-02-10 17 views
6

Sto tentando di implementare l'elaborazione dei dati delle immagini di anteprima della videocamera utilizzando l'API di camera2 come proposto qui: Camera preview image data processing with Android L and Camera2 API.Converti android.media.Image (YUV_420_888) in Bitmap

Ricevo correttamente i callback utilizzando onImageAvailableListener, ma per l'elaborazione futura è necessario ottenere bitmap da YUV_420_888 android.media.Image. Ho cercato domande simili, ma nessuna di queste ha aiutato.

Potresti suggerirmi come convertire android.media.Image (YUV_420_888) in Bitmap o forse c'è un modo migliore di ascoltare i frame di anteprima?

risposta

2

Scrivo un codice su questo, ed è l'anteprima dei dati YUV e lo si cambia in dati JPEG, e posso usarlo per salvare come bitmap, byte [] o altro. (Puoi vedere la classe "Allocazione").
E documento SDK dice:
"Per elaborazione YUV efficiente con android.renderscript: Creare un'allocazione RenderScript con un tipo YUV supportato, il flag IO_INPUT e una delle dimensioni restituite da getOutputSizes (Allocation.class), quindi ottenere il valore Superficie con getSurface(). "

Ecco il codice, spero che vi aiuterà a: https://github.com/pinguo-yuyidong/Camera2/blob/master/camera2/src/main/rs/yuv2rgb.rs

2

Per una soluzione più semplice vedere la mia applicazione qui:

Conversion YUV 420_888 to Bitmap (full code)

La funzione prende il media.image come input, e crea tre Allocazione di RenderScript basata sui piani y, u e v. Segue la logica YUV_420_888 come mostrato in questa illustrazione di Wikipedia.

enter image description here

Tuttavia, qui ci sono tre piani dell'immagine separati per Y, U e V-canali, così prendo questi come tre byte [], cioè allocazioni U8. L'allocazione y ha dimensioni larghezza * altezza byte, mentre le allocazioni u e v hanno larghezza larghezza * altezza/4 byte ciascuna, il che riflette il fatto che ogni u-byte copre 4 pixel (idem ogni byte v).

Problemi correlati