2015-08-25 22 views
7

Ben bu android uygulaması var.bir yüzeye bir android.media.Image çizmek

'u SurfaceHolder aracılığıyla nereden a SurfaceView kullanın.

Ayrıca videoları akışlandırmak için ExoPlayer kullanın. Ancak ImageReader'u, Surface'u alıyorum ve ExoPlayer'a geçirdim.

Şimdi, ImageReader.OnImageAvailableListener#onImageAvailable'deyim ve en son Image numaralı telefona erişiyorum.

Image'u değiştirmek ve yeni verileri "SurfaceView" Surface'a göndermek istiyorum.

android.media.Image bir android.view.Surface için "nasıl" çizebilirim? arasında

+0

bir 'MediaProjection' (Android 5.0+ ekran API elde edilen bir 'Image' dönüştürmek için yüzen kod bulunmaktadır) bir "Bitmap" içine, dikkate alarak. Yine de sadece bir uçağı var. YUV 'Image' için aynı şeyi yapmak için bir reçete olduğunu varsayalım. – CommonsWare

+0

Bunu yapabiliyor musunuz? – RohitMat

cevap

1

Olası yinelenen: how to draw image on surfaceview android

İlk lockCanvas() kullanarak tuval olsun ikinci resminizi olsun, (here bakınız) ve bir çekilebilir kullanarak yapmak:

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

Bundan sonra çekilebilir çizebilirsiniz Kilitlenen tuvale ve güncel tuvali tekrar yüzey görünümüne göndermek için unlockCanvasAndPost (Canvas canvas) kullanın.

+0

Üzgünüz, ama anlamıyorum: Bir android.media.Image örneğini dönüştürmek için Bitmap.createBitmap'i nasıl kullanabilirim? Bir görüntü kaynağı hakkında konuşmuyorum ... –

+0

Medya resmini nasıl aldınız? Gerçek verilere işaret eden bir uri olmalı. –

+0

Buradaki cevaba bir bakın http://stackoverflow.com/questions/26673127/android-imagereader-acquirelatestimage-returns-invalid-jpg Bu, bitmap'i görüntü nesnesinden nasıl çıkarabileceğinizdir. –

0

sorunuzun cevabı buradadır.

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

üzgünüm ... NE ?! –

+0

Ne için ???? –

İlgili konular