直播代码如何将当前摄像头预览图像保存为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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章