Draw android.media.Image to the surface

I have this Android app.

It uses SurfaceView , from where I get Surface through SurfaceHolder .

It also uses ExoPlayer for video streaming. However, I created an instance of ImageReader , getting its Surface and going to ExoPlayer .

Now I am in ImageReader.OnImageAvailableListener#onImageAvailable and I am accessing the latest Image .

I want to manipulate Image and send new data to the Surface .

How can I "draw" android.media.Image on android.view.Surface ?

+10
android exoplayer
source share
3 answers

The question is not clear to me. The way to get android.media.Image is through the Camera2 API, and there you can specify the surface, and the "camera" will draw on top of it. Please refer to Camera2Video example

Another way to get an Image object is from ImageReader (for example, when decoding a video). In this case, you want to draw an image, but you cannot provide a surface for ImageReader (there is an inner surface that is not displayed). In this case, you can draw the image on SurfaceView. Assuming this is the case, you need to convert the image to raster objects.

You have a discussion on how to accomplish this here.

0
source share

Possible duplicate: how to draw an image on an Android browser

First, grab your canvas with lockCanvas() (see here ), the second will get your image and make it available with:

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

After that, you can draw the selection onto a locked canvas and use unlockCanvasAndPost (Canvas canvas) to post the updated canvas back to the surface overview.

-one
source share

here is the answer to your question.

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); } } } } } } 
-4
source share

All Articles