随着android软硬件的不断升级,目前主流的android手机拍照功能非常强大,尤其是分辨率不断提高,一张照片下来得3-6M。但是在有些场景下,其实不需要那么高清的图片,需要600*480甚至更小,而且图片小,传输快,对于服务端的存储压力也小。目前我所在的项目就有这样的需求,需要上传一些BUG图片到服务器。目前这些图片都是屏幕截图和手机自带相机拍摄,太大了,都是3-6M。如果直接将3-6M的图片压缩到300K左右,图片就看不清了。于是计划采用自定义相机进行拍照。
第一步:定义一个SurfaceView
SurfaceView surfaceView = (SurfaceView) this .findViewById(R.id.surfaceView);
surfaceView.getHolder() .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置分辨率
surfaceView.getHolder().setFixedSize(320, 240); surfaceView.getHolder().addCallback(new SurfaceCallback());
注:在有些android手机上surfaceView.getHolder().setFixedSize(320, 240);无效,需要在第二步设置图片尺寸
第二步:在serfaceView回调里设置camera参数
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewFrameRate(5); //每秒5帧
//设置照片的输出格式
parameters.setPictureFormat(PixelFormat.JPEG);
//照片质量
parameters.set(“jpeg-quality”, 100);
int width = 640;
int height = 480;
parameters.setPictureSize(width, height); //设置图片尺寸
注:在设置图片尺寸的时候,width和height必须是设备支持的尺寸,否则会黑屏。如果希望拍摄尽可能小的图片可以通过下面的代码获取设备支持的尺寸列表,从中取最小的尺寸。
第三步:聚焦
camera.autoFocus(null);
拍照前,必须要主动聚焦。这一步很重要,要不然图片是模糊的
第四步:拍照
camera.takePicture(null, null, new TakePictureCallback()); // 拍照
第五步:获取图片并保存
总结:通过这样自定义拍照,在andorid手机上拍摄的清晰照片可以缩小的几十K。