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);