美文网首页Android进阶之路flutterandroid
Carson带你学Android:将当前摄像头预览图像保存为Bi

Carson带你学Android:将当前摄像头预览图像保存为Bi

作者: Carson带你学安卓 | 来源:发表于2019-11-25 07:48 被阅读0次

    前言

    今天,carson将结合示例讲解:如何将当前摄像头预览图像保存为Bitmap对象 & 保存到本地


    1. 背景

    正开启摄像头预览


    2. 需求

    将当前摄像头预览的图像保存为Bitmap对象 & 保存到手机本地文件夹


    3. 具体实现

    // 步骤1:定义存储路径 
    private static final String SD_PATH = "/sdcard/carsonfile/pic/";
    private static final String IN_PATH = "/carsonfile/pic/";
    
    
    // 步骤2:在摄像头回调数据时将数据存储为BitMap
    private Camera.PreviewCallback mPreivewCallback = new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(final byte[] data, final Camera camera) {
                    // a. 异步处理
                    mPreviewHandlerThread.postToWorker(new Runnable() {
                        @Override
                        public void run() {
    
                            // b. 获得摄像头预览Size
                            Camera.Size size = mCamera.getParameters().getPreviewSize();
                            try {
                               // c. 创建YUV对象
                                YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
                                if (image != null) {
    
                                    // d. 存为BitMap对象
                                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                                    image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
                                    Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
    
                                    // e. 保存到文件 - 下面分析1
                                    saveBitmap(mContext, bmp);
                                    stream.close();
                                }
                            } catch (Exception ex) {
                                Log.e("carson", "Error:" + ex.getMessage());
                            }
                        }
    
                    });
    
                }
            };
    
    // 分析1:存到手机文件夹
    public static String saveBitmap(Context context, Bitmap mBitmap) {
            String savePath;
            File filePic;
            if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
                savePath = SD_PATH;
            } else {
                savePath = context.getApplicationContext().getFilesDir()
                    .getAbsolutePath()
                    + IN_PATH;
            }
            try {
                filePic = new File(savePath + generateFileName() + ".jpg");
                if (!filePic.exists()) {
                    filePic.getParentFile().mkdirs();
                    filePic.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(filePic);
                mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                fos.flush();
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
    
            Log.i(TAG, "carsonho:filePic.getAbsolutePath():%s", filePic.getAbsolutePath());
    
            return filePic.getAbsolutePath();
        }
    
        private static String generateFileName() {
            return UUID.randomUUID().toString();
        }
        
    // 步骤3:设置回调
    mCamera.setPreviewCallBack(mPreivewCallback);
    

    4. 总结

    接下来我将继续介绍 Android开发中的相关知识,感兴趣的同学可以继续关注本人博客Carson_Ho的开发笔记

    相关系列文章阅读
    Carson带你学Android:学习方法
    Carson带你学Android:四大组件
    Carson带你学Android:自定义View
    Carson带你学Android:异步-多线程
    Carson带你学Android:性能优化
    Carson带你学Android:动画


    欢迎关注Carson_Ho的简书

    不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度


    请点赞!因为你的鼓励是我写作的最大动力!

    相关文章

      网友评论

        本文标题:Carson带你学Android:将当前摄像头预览图像保存为Bi

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