Dibuje un android.media.Image a una superficie

Tengo esta aplicación de Android.

Utiliza un SurfaceView , desde donde obtengo la Surface través de SurfaceHolder .

También utiliza ExoPlayer para transmitir videos. Sin embargo, he instanciado un ImageReader , obtener su Surface y pasar a la ExoPlayer .

Ahora, estoy en el ImageReader.OnImageAvailableListener#onImageAvailable y ImageReader.OnImageAvailableListener#onImageAvailable a la última Image .

Quiero manipular la Image y enviar los nuevos datos a la Surface " SurfaceView ".

¿Cómo puedo "dibujar" un android.media.Image a un android.view.Surface ?

Posible duplicado de: cómo dibujar la imagen en el androide de vista superficial

Primero obtenga su lienzo usando lockCanvas() (vea aquí ), obtenga su imagen y haga que sea un dibujable usando:

 my_bitmap = Bitmap.createBitmap( MediaStore.Images.Media.getBitmap(getContentResolver(), uri), 0,0,90, 90); drawable=new BitmapDrawable(my_bitmap); 

Después de eso, puede dibujar el dibujable en el lienzo bloqueado y utilizar unlockCanvasAndPost (Canvas canvas) para publicar el lienzo actualizado de nuevo a la vista de superficie.

Aquí está la respuesta para su pregunta.

MainActivity.java

 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mySurfaceView mySurfaceView = new mySurfaceView(getApplicationContext()); setContentView(mySurfaceView); } } 

MySurfaceView.java

 public class mySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private TutorialThread _thread; public mySurfaceView(Context context) { super(context); getHolder().addCallback(this); _thread = new TutorialThread(getHolder(), this); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon); canvas.drawColor(Color.BLACK); canvas.drawBitmap(_scratch, 10, 10, null); } public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } public void surfaceCreated(SurfaceHolder arg0) { _thread.setRunning(true); _thread.start(); } public void surfaceDestroyed(SurfaceHolder arg0) { boolean retry = true; _thread.setRunning(false); while (retry) { try { _thread.join(); retry = false; } catch (InterruptedException e) { } } } class TutorialThread extends Thread { private SurfaceHolder _surfaceHolder; private mySurfaceView _panel; private boolean _run = false; public TutorialThread(SurfaceHolder surfaceHolder, mySurfaceView panel) { _surfaceHolder = surfaceHolder; _panel = panel; } public void setRunning(boolean run) { _run = run; } @Override public void run() { Canvas c; while (_run) { c = null; try { c = _surfaceHolder.lockCanvas(null); synchronized (_surfaceHolder) { _panel.onDraw(c); } } finally { if (c != null) { _surfaceHolder.unlockCanvasAndPost(c); } } } } } } 
  • ExoPlayer y comandos start / pause / seekTo
  • Android ExoPlayer no reanuda una vez que la red está conectada
  • Reproducción de HLS con ExoPlayer
  • Cómo jugar video de youtube en ExoPlayer en Android?
  • Cómo implementar oncompletionlistener para detectar final de archivo multimedia en Exoplayer
  • ¿Cómo escuchar mp3 url usando exoplayer?
  • Control del volumen de Exoplayer con una barra de búsqueda
  • Android ExoPlayer onProgressChanged
  • Exo player DASH Ejemplo de streaming
  • Cómo mostrar subtítulos en android ExoPlayer
  • Reproducción de vídeo cifrado con ExoPlayer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.