最近做了一个图片识别、以及搜索的小项目,其中有一个模块是拍照以及拍照后对图片进行剪切,开始用的系统的相机和裁剪,由于系统的相机和裁剪多出了一些不必要的步骤和启动慢等等带给用户的体验不好,故自己写了一个,下面给大家简要介绍下:
自定义相机:定义SurfaceView得到SurfaceHolder,然后添加回调
<span style="white-space:pre"> </span>surface_camera = (SurfaceView) findViewById(R.id.camera_preview); view_focus = findViewById(R.id.view_focus); surface_holder = surface_camera.getHolder(); surface_holder.addCallback(this);
在回调中将SurfaceView和camera关联在一起,然后进行初始化、连续对焦然后销毁,这里简单把代码粘一下
@Override public void surfaceCreated(SurfaceHolder holder) { if(camera != null){ try { camera.setPreviewDisplay(surface_holder); } catch (IOException e) { System.out.println(e); } } mode = MODE.FOCUSING; updateCameraParameters(); camera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { camera.autoFocus(new AutoFocusCallback() { @Override public void onAutoFocus(boolean arg0, Camera arg1) { // TODO Auto-generated method stub if (arg0) { updateCameraParameters();// 实现相机的参数初始化 } } }); } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null && holder != null) { camera.stopPreview(); camera.release(); camera = null; } }
在实现连续对焦的方式我是采用的传感器实现的,通过手机位置或者说角度发生微弱变化然后调用对焦功能,这样子和实际的系统自带的相机的体验差不多
@Override public void onSensorChanged(SensorEvent arg0) { // TODO Auto-generated method stub float x = arg0.values[0]; float y = arg0.values[1]; float z = arg0.values[2]; if (!mInitialized){ mLastX = x; mLastY = y; mLastZ = z; mInitialized = true; } float deltaX = Math.abs(mLastX - x); float deltaY = Math.abs(mLastY - y); float deltaZ = Math.abs(mLastZ - z); if(deltaX > .3 || deltaY > .3 || deltaZ > .3){ if(CustomCameraView.camera != null){ cameraView.setFocus(); } } mLastX = x; mLastY = y; mLastZ = z; }
变焦的话,就不多说了就是简单的silder实现的,“点击对焦”简单调用自动对焦实现的,这里也存在了一个问题就是打开相机之后,如果进行了点击对焦之后就不能进行连续对焦了,这里我只用到了连续对焦没有使用点击对焦,所以就没有深入探究原因。
拍照后保存
<span style="white-space:pre"> </span>/** * 拍照 */ public void takePicture() { if (camera != null) { camera.takePicture(null, null, new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File folder = new File(Environment .getExternalStorageDirectory().getAbsolutePath() + CUSTOMECAMERA_PHOTO_PATH); if (folder.exists() == false) { folder.mkdirs(); } File pictureFile = new File(folder.getAbsoluteFile(), "temp.jpg"); try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); if (onTakePictureInfo != null) { onTakePictureInfo.onTakePictureInofo(true); } } catch (Exception e) { if (onTakePictureInfo != null) { mode = MODE.NONE; onTakePictureInfo.onTakePictureInofo(false); } } } }); mode = MODE.NONE; } }
关于剪切拿到了的源码,在上面进行了简要的修改,我这里需要的是横屏,最后的结果:
拍照界面
裁剪界面
下载地址:http://download.csdn.net/detail/u012350993/8285313,里面一些东西我没有去除,文件有点略大。