Android中自定义相机Camera连拍

我们上次介绍了利用Camera进行拍照,实现自定义相机的效果。这一次我们基于上一次的项目,实现连拍效果。上次博客路径奉上

Android中自定义相机Camera使用

好了,我们正题开始。

基于上一次的项目,首先我们添加一些需要的全局变量。

//连拍属性
private boolean isShooting = false;//是否正在连拍
private int shooting_num = 0;//已经拍摄的相片数量
private ArrayList<String> mShootingArray;//连拍的相片保存路径队列

接着我们编写一个执行连拍的方法

/**
 * 执行连拍动作。外部调用该方法完成连拍
 */
public void doTakeShooting(){
    mShootingArray = new ArrayList<>();
    isShooting = true;
    shooting_num = 0;
}

然后修改点击事件触发的方法

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.bt_take_photo:
            //点击拍照
            //doTakePicture();
            //点击连拍
            doTakeShooting();
            break;
    }
}

接着我们放开上次项目中的一句代码。大家可能发现,上次SurfaceHolder.Callback回调的surfaceChanged回调方法中,有这样一句话

//设置相机的预览监听器。注意这里的setPreviewCallback给连拍功能用
//            mCamera.setPreviewCallback(mPr);

我们把这个注释打开就好。

接着我们就加入这个监听,代码如下

    /**
     * 定义一个画面预览的回调监听器,在此可捕获动态的连续图片
     */
    private Camera.PreviewCallback mPr = new Camera.PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            if (!isShooting){
                return;
            }
            //获取相机的参数信息
            Camera.Parameters parameters = camera.getParameters();
            //获得预览数据的格式
            int imageFormat = parameters.getPreviewFormat();
            int width = parameters.getPreviewSize().width;
            int height = parameters.getPreviewSize().height;
            Rect rect = new Rect(0,0,width,height);
            //创建一个YUV格式的图像对象
            YuvImage yuvImage = new YuvImage(data,imageFormat,width,height,null);
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                yuvImage.compressToJpeg(rect,80,bos);
                //从字节数组中解析出位图数据
                Bitmap raw = BitmapFactory.decodeByteArray(bos.toByteArray(),0,bos.size());
                //旋转位图
                Bitmap bitmap = getRotateBitmap(raw,(mCameraType == CAMERA_BEHIND)?90:-90);
                //获取本次拍摄的照片路径
                List<String> listPath = new ArrayList<>();
                listPath.add("myCamera");
                listPath.add("photos");
                String path = PathGetUtil.getLongwayPath(MainActivity.this, listPath);
                File fileDir = new File(path);
                if (!fileDir.exists()) {
                    fileDir.mkdirs();
                }
                File filePic = new File(path, "ww" + System.currentTimeMillis() + ".jpg");
                if (!filePic.exists()) {
                    try {
                        filePic.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                saveImage(filePic.getPath(), bitmap);
                //在此进入预览画面
                camera.startPreview();
                shooting_num++;
                mShootingArray.add(path);
                if (shooting_num>8){
                    //每次连拍9张
                    isShooting = false;
                    ToastUtil.toastWord(MainActivity.this,"已完成连拍");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

这样当我们点击拍照的时候就会直接连拍九张图片。

猜你喜欢

转载自blog.csdn.net/weixin_38322371/article/details/115161027
今日推荐