zoukankan      html  css  js  c++  java
  • android Camera相机类

    Camera相机类相关的几个流程方法

    Camera.open(cameraId) 打开相机

    camera.setDisplayOrientation(0) 设置相机水平方向

    mCamera.setPreviewDisplay(holder) 在SurfaceHolder上显示画面

    mCamera.setPreviewCallback(callback) 设置回调,将Yuv数据传递到onPreviewFrame方法

    previewRate mParams = mCamera.getParameters() 获取相机相关参数

    mCamera.stopPreview() 停止预览

    mCamera.release() 释放相机

    实现Camera.PreviewCallback接口获取Yuv视频流

    @Override
    public void onPreviewFrame(byte[] bytes, Camera camera) {
           //获取实时的Yuv数据流
    }

    实现Camera.PictureCallback接口实现拍照

    private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
             String pictureDir = Environment.getExternalStorageDirectory() + File.separator +"Videocmo/images";
             String pictureName = DateFormat.format("yyyyMMddHHmmss",new Date()).toString()+ ".jpg";
             String path=pictureDir+ File.separator + pictureName;
             try {
                  File file = new File(pictureDir);
                  if (!file.exists()) {
                       file.mkdirs();
                  }
                  FileOutputStream fos = new FileOutputStream(path);
                  fos.write(data);
                  fos.close();
             } catch (FileNotFoundException ignored) {
             } catch (IOException ignored) {
             }
       }
    };
    mCamera.takePicture(
    null, null, mPictureCallback);

    寻找相机

    private int findCamera(boolean isfront) {
        int cameraCount = 0;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
    
        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo);
            if (isfront) {
                // CAMERA_FACING_FRONT前置
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                    return camIdx;
                }
            } else {
                // CAMERA_FACING_BACK后置
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                    return camIdx;
                }
            }
    
        }
        return -1;
    }

    Camera.Parameters相机参数类

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

    List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes(); //获取摄像头支持的各种分辨率

    parameters.setPictureFormat(PixelFormat.JPEG);//设置照片格式

    parameters.setPreviewSize(witdh,height); //设置预览尺寸

    parameters.setPictureSize(witdh,height); //设置分辨率

    camera.setParameters(parameters);//提交相机参数

    设置相机分辨率

    private void initCamera(Camera mCamera){
        if(mCamera != null){
            try{
                mParams = mCamera.getParameters();
                Size previewSize = CamParaUtil.getInstance().getPropPreviewSize(mParams.getSupportedPreviewSizes(),1.333f, 640);
                Log.d("log", String.valueOf(previewSize.width) + "-" + previewSize.height);
                pWidth = previewSize.width;
                pHeight = previewSize.height;
                mParams.setPreviewSize(pWidth, pHeight);
    
                List<String> focusModes = mParams.getSupportedFocusModes();
                if(focusModes.contains("continuous-video")){
                    mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
                }
                mCamera.setParameters(mParams);
                mCamera.startPreview();
    
                isPreviewing = true;
                mPreviwRate = previewRate;
            }catch (Exception ex){
                ex.printStackTrace();
            }
    
        }
    }
    
    public Size getPropPreviewSize(List<Size> list, float th, int minWidth){
        Collections.sort(list, sizeComparator);
    
        int i = 0;
        for(Size s:list){
            if((s.width >= minWidth) && equalRate(s, th)){
                break;
            }
            i++;
        }
        if(i == list.size()){
        }
        return list.get(i);
    }

     相关阅读

    SurfaceView开启相机预览

  • 相关阅读:
    一周随笔--15.10.06
    KVC/KVO总结
    一周随笔--15.9.28
    一周随笔--15.9.21
    CocoaPods使用中的invalid byte sequence in US-ASCII错误
    自定义TabBar
    FMDB配合sqlite使用
    常用第三方库
    LLDB编译器命令
    coreData
  • 原文地址:https://www.cnblogs.com/94xiyang/p/9494624.html
Copyright © 2011-2022 走看看