前言
今天,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的开发笔记
相关系列文章阅读
Carson带你学Android:学习方法
Carson带你学Android:四大组件
Carson带你学Android:自定义View
Carson带你学Android:异步-多线程
Carson带你学Android:性能优化
Carson带你学Android:动画
欢迎关注Carson_Ho的简书
不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度。
网友评论