美文网首页其他
手机相机的使用

手机相机的使用

作者: 大旺旺的弟弟小旺旺 | 来源:发表于2021-08-28 13:18 被阅读0次

    手机相机的使用步骤:
    1.打开相机,一般会有前置和后置摄像头。

     camera = Camera.open(cameId);
    

    2.设置相机的参数,预览和图片尺寸。

    //先获取相机参数
    Camera.Parameters param=camera.getParameters();
    

    获得相机支持的大小参数,然后通过参数去选择一个合适的尺寸。一般选择的是高度大于最小宽度,缩放比相近的参数。

    
        private Camera.Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){
            Collections.sort(list, sizeComparator);
            int i = 0;
            for(Camera.Size s:list){
                if((s.height >= minWidth) && equalRate(s, th)){
                    break;
                }
                i++;
            }
            if(i == list.size()){
                i = 0;
            }
            return list.get(i);
        }
    

    将它们设置到参数中,一般设置预览和图片尺寸即可。

    param.setPictureSize(picSize.width,picSize.height);
    param.setPreviewSize(preSize.width,preSize.height);
    camera.setParames(param);
    

    将相机结果绘制到纹理,使用SurfaceTexture.

        public void setPreviewTexture(SurfaceTexture texture){
            if(camera!=null){
                try {
                    camera.setPreviewTexture(texture);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    

    3.预览

        public boolean preview() {
            if(camera!=null){
                camera.startPreview();
            }
            return false;
        }
    

    加入权限

    <uses-permission android:name="android.permission.CAMERA" />
    

    检测是不是成功得到权限

        public static void askPermission(Activity context, String[] permissions, int req, Runnable
                runnable){
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
                int result= ActivityCompat.checkSelfPermission(context,permissions[0]);
                if(result== PackageManager.PERMISSION_GRANTED){
                    runnable.run();
                }else{
                    ActivityCompat.requestPermissions(context,new String[]{Manifest.permission.CAMERA
                            ,Manifest.permission.WRITE_EXTERNAL_STORAGE},req);
                }
            }else{
                runnable.run();
            }
        }
    

    绘制

    一般的我们通过纹理将相机的数据放入到纹理中,然后通过绘制纹理达到绘制相机的效果。我们的所有操作都是基于这个纹理进行的。
    简单绘制绘制代码。

    public class MyCameraDrawer implements GLSurfaceView.Renderer {
        private SurfaceTexture surfaceTexture;
        private float[] matrix=new float[16];
        private int width,height
        private int dataWidth,dataHeight;
        private AFilter mOesFilter;
        private int cameraId=1;
    
        public MyCameraDrawer(Resources  resources){
            mOesFilter=new OesFilter(resources);
        }
    
        @Override
        public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
            int texture = createTextureID();
            surfaceTexture=new SurfaceTexture(texture);
            mOesFilter.create();
            mOesFilter.setTextureId(texture);
        }
    
        @Override
        public void onSurfaceChanged(GL10 gl10, int i, int i1) {
            setViewSize(width,height);
        }
    
        @Override
        public void onDrawFrame(GL10 gl10) {
            if(surfaceTexture!=null){
                surfaceTexture.updateTexImage();
            }
            mOesFilter.draw();
        }
    
        public void setDataSize(int dataWidth,int dataHeight){
            this.dataWidth=dataWidth;
            this.dataHeight=dataHeight;
            calculateMatrix();
        }
    
        public void setViewSize(int width,int height){
            this.width=width;
            this.height=height;
            calculateMatrix();
        }
    
        private void calculateMatrix(){
            Gl2Utils.getShowMatrix(matrix,this.dataWidth,this.dataHeight,this.width,this.height);
            if(cameraId==1){
                Gl2Utils.flip(matrix,true,false);
                Gl2Utils.rotate(matrix,90);
            }else{
                Gl2Utils.rotate(matrix,270);
            }
            mOesFilter.setMatrix(matrix);
        }
    
        public SurfaceTexture getSurfaceTexture(){
            return surfaceTexture;
        }
    
        public void setCameraId(int id){
            this.cameraId=id;
            calculateMatrix();
        }
    
    
        private int createTextureID(){
            int[] texture = new int[1];
            GLES20.glGenTextures(1, texture, 0);
            GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texture[0]);
            GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                    GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);
            GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                    GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
            GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                    GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                    GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
            return texture[0];
        }
    }
    
    

    相关文章

      网友评论

        本文标题:手机相机的使用

        本文链接:https://www.haomeiwen.com/subject/nyrciltx.html