使用Camera和GLSurfaceView创建自定义相机预览画面并在预览画面上加入自定义图形

本文档介绍如何使用Camera和GLSurfaceView创建自定义相机预览画面,并在预览画面上添加自定义图形。通过SurfaceTexture接收相机预览数据,使用OpenGL ES进行图像处理和显示。详细讲解了Shader的编写、顶点和纹理坐标的定义,以及如何将数据传输给Shader。同时,讨论了自定义相机的工作原理和实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:本文档参考https://blog.youkuaiyun.com/lb377463323/article/details/77071054大家可以看看他的讲解,我用的代码是在他的基础上更改的,并在代码里合适的地方加入了注解,由于我还不会gitHub所以直接在这里贴代码了。(现已改为百度链接)

注意!注意!注意!

一定要去看他的讲解,我能力有限说的没他好,不过我还是决定把他全搬过来了,望谅解!!!

 

首先讲一下,本文不使用Camera的PreviewCallback预览回调接口,因为onPreviewFrame()获取的数据格式只能是NV21或NV12,除非修改HAL层代码,一般情况下NV21或NV12需要转成RGB格式然后进行处理,这样太耗时了,所以本文使用SurfaceTexture来获取预览图像。

1. 添加GLSurfaceView作为布局界面

伪代码如下,这个不细讲了,可以参考我之前的博客 Android初始化OpenGL ES,并且分析Renderer子线程原理

    //实例化一个GLSurfaceView
    mGLSurfaceView = new GLSurfaceView(this);
    //配置OpenGL ES,主要是版本设置和设置Renderer,Renderer用于执行OpenGL的绘制
    mGLSurfaceView.setEGLContextClientVersion(2);
    mGLSurfaceView.setRenderer(new GLSurfaceView.Renderer());
    //在屏幕上显示GLSurfaceView
    setContentView(mGLSurfaceView);

2. 在onCreate方法中开启相机并设置参数(本文只使用后置摄像头)

    mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
    mCamera = Camera.open(mCameraId)
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.set("orientation", "portrait");
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
    parameters.setPreviewSize(1280, 720);
    mCamera.setDisplayOrientation(90)
    setCameraDisplayOrientation(mActivity, mCameraId, mCamera);
    mCamera.setParameters(parameters);

3. GLSurfaceView创建好OpenGL ES的环境后,在Renderer的onSurfaceCreated()中,创建一个外部纹理用于接收预览数据

    public static int createOESTextureObject() {
        int[] tex = new int[1];
        //生成一个纹理
        GLES20.glGenTextures(1, tex, 0);
        //将此纹理绑定到外部纹理上
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, tex[0]);
        //设置纹理过滤参数
        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
        //解除纹理绑定
        GLES20.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值