Android使用技巧:将当前摄像头预览图像保存为Bitmap对象 & 保存到本地


前言

今天,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的开发笔记

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

相关文章阅读
Android开发:最全面、最易懂的Android屏幕适配解决方案
Android事件分发机制详解:史上最全面、最易懂
Android开发:史上最全的Android消息推送解决方案
Android开发:最全面、最易懂的Webview详解
Android开发:JSON简介及最全面解析方法!
Android四大组件:Service服务史上最全面解析
Android四大组件:BroadcastReceiver史上最全面解析


欢迎关注Carson_Ho的简书!

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

推荐阅读更多精彩内容