直播代碼如何將當前攝像頭預覽圖像保存爲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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章