【问题标题】:draw an android.media.Image to a surface将 android.media.Image 绘制到表面
【发布时间】:2015-08-25 16:12:05
【问题描述】:

我有这个安卓应用程序。

它使用SurfaceView,从那里我通过SurfaceHolder获得Surface

它还使用ExoPlayer 流式传输视频。但是我已经实例化了一个ImageReader,得到它的Surface 并传递给ExoPlayer

现在,我在ImageReader.OnImageAvailableListener#onImageAvailable 访问最新的Image

我想操作Image并将新数据发送到“SurfaceViewSurface

如何将android.media.Image“绘制”到android.view.Surface

【问题讨论】:

  • 有一些代码可以将ImageMediaProjection(Android 5.0+截图API)获取到Bitmap,考虑到stride。不过,那些只有一架飞机。我假设有一个方法可以为 YUV Image 做同样的事情。
  • 你能做到吗?

标签: android exoplayer


【解决方案1】:

我不清楚这个问题。 获取 android.media.Image 的方法是通过 Camera2 API,您可以在其中提供一个表面,“相机”将覆盖它。请参考Camera2Video example

获取 Image 对象的另一种方法是从 ImageReader(例如在解码视频时)。在这种情况下,您想要绘制图像,但您无法为 ImageReader 提供表面(有一个未显示的内部表面)。在这种情况下,您可以在 SurfaceView 上绘制图像。 假设是这种情况,您需要将 Image 转换为 Bitmap 对象。

你已经讨论了如何执行这个here

【讨论】:

    【解决方案2】:

    可能重复:how to draw image on surfaceview android

    首先使用lockCanvas()(参见here)获取您的画布,然后使用以下方法获取您的图像并使其成为可绘制对象:

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

    之后,您可以将可绘制对象绘制到锁定的画布上并使用unlockCanvasAndPost (Canvas canvas) 将更新后的画布发布回表面视图。

    【讨论】:

    • 对不起,但我不明白:如何使用 Bitmap.createBitmap 转换 android.media.Image 实例?我不是在谈论图像资源......
    • 您是如何获得媒体图像的?它应该有一个指向实际数据的 uri。
    • 看看这里的答案stackoverflow.com/questions/26673127/…这是如何从图像对象中获取位图的。
    • 我将 ImageReader 中的图像附加到 MediaCodec
    • 您应该在问题中明确说明,我不确定如何帮助您处理 YUV,抱歉。
    【解决方案3】:

    这是您问题的答案。

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

    【讨论】:

    • 这个答案中没有关于 Image 或 ImageView 的内容。我认为这个问题没有被理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多