2015-08-25 22 views
7

Mam tę aplikację na Androida.narysuj android.media.Image na powierzchni

Używa ona SurfaceView, skąd otrzymuję Surface przez SurfaceHolder.

Do przesyłania strumieniowego wideo jest również używany ExoPlayer. Jednak stworzyłem ImageReader, uzyskując jego Surface i przekazując do ExoPlayer.

Teraz jestem w ImageReader.OnImageAvailableListener#onImageAvailable i mam dostęp do najnowszego Image.

Chcę manipulować Image i wysłać nowe dane do "SurfaceView" Surface.

Jak mogę "narysować" android.media.Image na android.view.Surface?

+0

Jest to kod krąży przekształcania 'Image' otrzymany z' MediaProjection' (Mobile 5.0+ zrzut ekranu API) w "Bitmapę", biorąc pod uwagę krok. Jednak mają tylko jedną płaszczyznę. Zakładam, że istnieje recepta na robienie tego samego rodzaju rzeczy na obraz "YUV". – CommonsWare

+0

Czy byłeś w stanie to zrobić? – RohitMat

Odpowiedz

1

Możliwy duplikat: how to draw image on surfaceview android

Pierwszy uzyskać płótno za pomocą lockCanvas() (patrz here), po drugie uzyskać obraz i sprawiają, że odkształcalne używając:

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

Po tym można wyciągnąć rozciągliwej do zablokowanego płótna i użyj unlockCanvasAndPost (Canvas canvas), aby opublikować zaktualizowane płótno z powrotem do widoku powierzchni.

+0

Przepraszam, ale nie rozumiem: jak mogę użyć Bitmap.createBitmap do konwersji instancji android.media.Image? Nie mówię o zasobie obrazu ... –

+0

Skąd wziął się obraz medialny? Powinien mieć uri, który wskazuje na rzeczywiste dane. –

+0

Spójrz na odpowiedź tutaj http://stackoverflow.com/questions/26673127/android-imagereader-acquirelatestimage-returns-invalid-jpg W ten sposób można uzyskać bitmapę z obiektu obrazu. –

0

tutaj jest odpowiedź na twoje pytanie.

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

Przepraszam ... CO ?! –

+0

Odnośnie do czego ???? –