前言
今天,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的開發筆記