2015-08-25 7 views
7

Ich habe diese Android-Anwendung.Zeichnen Sie eine android.media.Image auf eine Oberfläche

Verwenden Sie eine SurfaceView, von wo ich die Surface durch die SurfaceHolder bekommen.

Es auch ExoPlayer verwenden, um Videos zu streamen. Allerdings habe ich eine ImageReader instanziiert, bekommen seine Surface und übergibt an die ExoPlayer.

Jetzt bin ich in der ImageReader.OnImageAvailableListener#onImageAvailable und ich greife auf die neueste Image.

Ich möchte die Image manipulieren und die neuen Daten an die "SurfaceView" Surface senden. Wie kann ich einen zu einem android.view.Surface "zeichnen"?

+0

Es gibt Code um einen 'Image' zum Umwandeln von einem' MediaProjection' (Android 5.0+ Bildschirm API erhalten Floating) in eine 'Bitmap', wobei Schritt berücksichtigt wird. Diese haben jedoch nur eine Ebene. Ich nehme an, dass es ein Rezept gibt, das für ein YUV 'Image' die gleiche Sache macht. – CommonsWare

+0

Konnten Sie das tun? – RohitMat

Antwort

1

Mögliche Duplikat: how to draw image on surfaceview android

zuerst Ihre Leinwand erhalten, indem lockCanvas() (siehe here), zweite Ihr Bild bekommen und es ist ein ziehbar mit machen:

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

Danach können Sie die ziehbar zeichnen auf die gesperrte Leinwand und verwenden Sie unlockCanvasAndPost (Canvas canvas), um die aktualisierte Leinwand zurück in die Oberflächenansicht zu stellen.

+0

Entschuldigung, aber ich verstehe nicht: Wie kann ich Bitmap.createBitmap verwenden, um eine android.media.Image-Instanz zu konvertieren? Ich spreche nicht über eine Bildquelle ... –

+0

Wie haben Sie das Medienbild bekommen? Es sollte ein URI haben, das auf die tatsächlichen Daten zeigt. –

+0

Werfen Sie einen Blick auf die Antwort hier http://stackoverflow.com/questions/26673127/android-imagereader-acquirelatestimage-returns-invalid-jpg Dies ist, wie Sie die Bitmap aus dem Bildobjekt erhalten können. –

0

Hier ist die Antwort auf Ihre Frage.

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); 
       } 
      } 
     } 
    } 
} 
} 
+0

Entschuldigung ... WAS ?! –

+0

In Bezug auf was ???? –