相机Camera

Camera需与SurfaceView配合使用

Camera类常用方法:

复制代码
Camera.open() 创建Camera实例,打开相机
getParameters() 获取相机参数
release() 释放相机资源
setParameters(Camera.Parameters parameters) 设置相机参数
setPreviewDisplay(SurfaceHolder holder) 设置用于预览的SurfaceView
setDisplayOrientation(int i) 设置默认角度,值为度数,如值为90即90°
startPreview() 开始预览
stopPreview() 停止预览
takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw, Camera.PictureCallback jepg) 用于拍摄,参数shutter为快门回调函数常用于音效等;参数raw为拍摄后回调提供照片数据;参数jpeg为拍摄后回调提供无损照片数据

相机参数常用方法

复制代码
setPictureSize(int width,int height)  设置图片尺寸
setPictureFormat(int pixelFormat)  设置图片格式,如PixelFormat.JPEG
set("jpeg-quality",int quality)  设置图片质量,quality值标准为65,一般为75左右,不超过100
setFocusMode(String focusMode) 设置对焦模式,如FOCUS_MODE_CONTINUOUS_PICTURE为连续图片对焦
java 复制代码
        //设置相机
        camera= Camera.open();
        Camera.Parameters parameters =camera.getParameters();
        parameters.setPictureSize(640*3,480*3);
        parameters.setPictureFormat(PixelFormat.JPEG);
        parameters.set("jpeg-quality",80);
        parameters.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);
java 复制代码
        //绑定SurfaceView
        SurfaceHolder surfaceHolder=surfaceView.getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
                try {
                    camera.setPreviewDisplay(surfaceHolder);
                    //启动预览
                    camera.startPreview();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
                try {
                    camera.setPreviewDisplay(surfaceHolder);
                    //启动预览
                    camera.startPreview();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
                try {
                    camera.setPreviewDisplay(surfaceHolder);
                    //启动预览
                    camera.startPreview();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });


        //设置拍摄按钮监听器
        putButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                camera.takePicture(null, null, new Camera.PictureCallback() {
                    public void onPictureTaken(byte[] bytes, Camera camera) {
                        camera.stopPreview();
                        Bitmap bitmap_base=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                        String sdPath= String.valueOf(Environment.getExternalStorageDirectory());
                        //API29以上已不允许在SD卡目录下创建文件夹或文件,需在已有(自带)文件夹下创建文件夹或文件
                        File file=new File(sdPath+"/DCIM/myCamera");
                        boolean fileExists=false;
                        if(!file.exists()){
                            fileExists=file.mkdirs();
                        }
                        else {
                            fileExists=true;
                        }
                        Log.d("OK","文件夹是否存在"+fileExists);
                        int num=1;
                        while (true){
                            String imageName="image"+num+".jpeg";
                            File imageFile=new File(file.getAbsolutePath()+"/"+imageName);
                            if(!imageFile.exists()){
                                //不存在,进行创建
                                imageFile.getParentFile().mkdirs();
                                try {
                                    imageFile.createNewFile();
                                } catch (IOException e) {
                                    throw new RuntimeException(e+"地址"+imageFile.getAbsolutePath());
                                }
                                try {
                                    FileOutputStream outputStream = new FileOutputStream(imageFile);
                                    bitmap_base.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
                                    Log.d("OK","保存完成"+imageFile.getAbsolutePath());
                                    outputStream.flush();
                                    outputStream.close();
                                } catch (FileNotFoundException e) {
                                    throw new RuntimeException(e);
                                } catch (IOException e) {
                                    throw new RuntimeException(e);
                                }
                                camera.startPreview();
                                break;
                            }
                            else {
                                num++;
                            }

                        }
                    }
                });

            }
        });
java 复制代码
    //要记得释放相机资源
    protected void onDestroy() {
        super.onDestroy();
        if(camera!=null){
            camera.release();
        }
    }


    protected void onPause() {
        super.onPause();
        camera.stopPreview();
    }


    protected void onRestart() {
        super.onRestart();
        camera.startPreview();
    }
相关推荐
m0_7269659822 分钟前
面面面,面面(1)
java·开发语言
xuhaoyu_cpp_java1 小时前
过滤器与监听器学习
java·经验分享·笔记·学习
程序员小假1 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha2 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji34162 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
木井巳2 小时前
【递归算法】子集
java·算法·leetcode·决策树·深度优先
钛态3 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos
王码码20353 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos
左手厨刀右手茼蒿3 小时前
Flutter for OpenHarmony: Flutter 三方库 shamsi_date 助力鸿蒙应用精准适配波斯历法(中东出海必备)
android·flutter·ui·华为·自动化·harmonyos