SurfaceView+Camera+OpenCv自定义相机保存图片
2016-10-12 11:07
435 查看
至于如何在项目中如何添加OpenCv的SDK在此不再赘述:我引入的OpenCv-SDK版本为OpenCV-3.1.0-android-sdk在Activity中实现CameraBridgeViewBase.CvCameraViewListener2接口并重写其方法,在
Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)方法中可以使用OpenCv的保存图片的方法,如下:
Imgcodecs.imwrite("/storage/emulated/0/" + "OpenCvimwrite.jpg", inputFrame.rgba());方法参数为:1.图片名称(包括路径)2.Mat类型的数据注:此方法保存的图片分辨率和预览分辨率相同(即Camera的PreviewSize属性)另外此图片可能比较模糊,通过查看JavaCameraView类中的Boolean initializeCamera(int width,int height)方法发现有以下两行代码:
int size = mFrameWidth * mFrameHeight;size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;将size改为
size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat());照片的效果会稍微好一点。下面切入主题,添加保存照片的方法:在JavaCameraView类中添加方法:
public void tackPhoto(final String name) { if (mCamera != null) { mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); saveMyBitmap(bmp, name); } }); }
public void saveMyBitmap(Bitmap mBitmap, String photoName) {if (isMediaMounted()) {String SDCardPath = Environment.getExternalStorageDirectory().getAbsolutePath().toString();createFileDir(SDCardPath + File.separator + "OpenCv");String FilePath = SDCardPath + File.separator + "OpenCv" + File.separator + photoName + ".jpg";File file = new File(FilePath);// "/storage/emulated/0/OpenCv" + "OpenCv.jpg",BufferedOutputStream bos = null;try {FileOutputStream fos = new FileOutputStream(file);bos = new BufferedOutputStream(fos);mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);bos.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (mBitmap != null) {mBitmap.recycle();}bos.close();} catch (IOException e) {e.printStackTrace();}}} else {Log.e(TAG, "saveMyBitmap: 没有挂载内存卡,无法保存图片");}}
/** * SD卡是否挂载 * * @return */ public static boolean isMediaMounted() { String status = Environment.getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { return true; } else { return false; } }这样在Activity中就可以调用JavaCameraView的tackPhoto()方法拍照了。
相关文章推荐
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片
- android 通过Camera和Surfaceview实现照相 图片预览 保存图片到本地 手动聚焦 FaceDetectionListener实现人脸识别
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片
- Android surfaceview 自定义相机 拍照(闪光灯、前后摄像头)
- 使用Camera与SurfaceView实现自定义拍照功能
- Android 自定义Camera之SurfaceView的使用(6.0权限申请)
- Android自定义Camera,用SurfaceView预览。
- 在SurfaceView/自定义View中利用手势绘制不同颜色不同形状的图形并且保存为Bitmap位图
- Android 自定义相机保存图片
- Android surfaceview 自定义相机 拍照(闪光灯、前后摄像头)
- 安卓高级8 SurfaceView案例二 自定义相机
- Android SurfaceView 自定义相机
- 使用OpenCv with Android Camera Surfaceview时OpenCVLoader失败问题
- android自定义拍照界面SurfaceView+Camera
- iOS uitableview自定义相册(实现拍照并保存在指定目录以相册的形式展示图片)
- Android Camera相机功能实现 拍照并保存图片
- Android Camera+SurfaceView实现自定义拍照
- 基于SurfaceView封装相机,并添加自定义水印效果
- Android 在ViewPager中使用的可以画线,放大,保存,点击删除线条的自定义图片显示控件
- Android 项目需求Camera + SurfaceView实现自定义拍照,遇到的问题