Android的Camera用SurfaceView拍照

原创 2016年08月30日 18:36:16

首先必须考虑Camera的Parameter的设置,必须要设置他的预览大小和图片大小。默认是用最大的,有时候会导致OOM错误。所以我们得算出最优的Size。

<pre name="code" class="java">
Camera.Parameters mParameters = mCamera.getParameters();List<Camera.Size> allSizes = mParameters.getSupportedPictureSizes(); List<Camera.Size> allSizes = mParameters.getSupportedPictureSizes(); List<Camera.Size> previewSizes = mParameters.getSupportedPreviewSizes(); Camera.Parameters mParameters = mCamera.getParameters();List<Camera.Size> allSizes = mParameters.getSupportedPictureSizes(); List<Camera.Size> previewSizes = mParameters.getSupportedPreviewSizes(); //1 PictureSizes和PreviewSizes都支持 2宽度小于屏幕宽度 List<Camera.Size> commonSizes=new ArrayList<>(); int previewWidth = Utils.getDeviceWidth(getActivity()); for(Camera.Size pictureSize:allSizes){ if(pictureSize.width<previewWidth){ for(Camera.Size previewSize:allSizes){ if(previewSize.width<previewWidth && pictureSize.width==previewSize.width && pictureSize.height==previewSize.height){ commonSizes.add(pictureSize); } } } } Collections.sort(commonSizes, new Comparator<Camera.Size>() { @Override public int compare(Camera.Size lhs, Camera.Size rhs) { return rhs.width*rhs.height-lhs.height*lhs.width; } }); Camera.Size size = commonSizes.get(0); // get top size //set max Picture Size,这两个最好是用同一个size,否则拍出来的图片跟预览的有差异或者不同 mParameters.setPictureSize(size.width, size.height);//设置最终得到图片的大小 mParameters.setPreviewSize(size.width, size.height);//设置预览图片的大小mCamera.setDisplayOrientation(90);//必须设置90否则预览会出现 预览窗口旋转了n*90°,不同厂商旋转的角度可能会不一样。Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info);result=info.orientation;//Camera.Parameters mParameters = mCamera.getParameters();List<Camera.Size> allSizes = mParameters.getSupportedPictureSizes(); List<Camera.Size> allSizes = mParameters.getSupportedPictureSizes(); List<Camera.Size> previewSizes = mParameters.getSupportedPreviewSizes(); Camera.Parameters mParameters = mCamera.getParameters();List<Camera.Size> allSizes = mParameters.getSupportedPictureSizes(); List<Camera.Size> previewSizes = mParameters.getSupportedPreviewSizes(); //1 PictureSizes和PreviewSizes都支持 2宽度小于屏幕宽度 List<Camera.Size> commonSizes=new ArrayList<>(); int previewWidth = Utils.getDeviceWidth(getActivity()); for(Camera.Size pictureSize:allSizes){ if(pictureSize.width<previewWidth){ for(Camera.Size previewSize:allSizes){ if(previewSize.width<previewWidth && pictureSize.width==previewSize.width && pictureSize.height==previewSize.height){ commonSizes.add(pictureSize); } } } } Collections.sort(commonSizes, new Comparator<Camera.Size>() { @Override public int compare(Camera.Size lhs, Camera.Size rhs) { return rhs.width*rhs.height-lhs.height*lhs.width; } }); Camera.Size size = commonSizes.get(0); // get top size //set max Picture Size,这两个最好是用同一个size,否则拍出来的图片跟预览的有差异或者不同 mParameters.setPictureSize(size.width, size.height);//设置最终得到图片的大小 mParameters.setPreviewSize(size.width, size.height);//设置预览图片的大小mCamera.setDisplayOrientation(90);//必须设置90否则预览会出现 预览窗口旋转了n*90°,不同厂商旋转的角度可能会不一样。Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info);result=info.orientation;//在PictrueCallback中会用来把图片旋转过来

接下来就是回调方法了
Camera.PictureCallback picture = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {

            
Matrix matrix = new Matrix();
matrix.postRotate(mRotateDegree);// 旋转45度 == matrix.setSinCos(0.5f, 0.5f);
newBitmap = Bitmap.createBitmap(rotateBitmap, 0, 0, rotateBitmap.getWidth(),
        rotateBitmap.getHeight(), matrix, true);

        }
    };

Android 项目需求Camera + SurfaceView实现自定义拍照,遇到的问题

首先要自定义SurfaceView实时显示摄像头捕获的画面 SurfaceView非常强大,有双缓存机制,可以在子线程更新ui,在游戏开发中最常用,下面是自定义SurfaceView 仿照别人的博...

Android Camera+SurfaceView实现自定义拍照

对Activity强制横屏,保证预览方向正确。使用OrientationEventListener监听设备方向,判断竖拍时,旋转照片后再保存,保证竖拍时预览图片和保存后的图片方向一致。       运...

Android实现拍照功能,使用SurfaceView+camera

实现手机拍照的功能使用SurfaceView+camera 可以在cmd命令中查询是图片,我这里是用当前系统时间作为图片的名字,用Log.i进行打印测试是否保存图片成功 首先在清单文件中配置获取手...

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级。后来随着我自己的使用,越来越发现不出个升级版的demo是不行了。有时候就连我自己用这个demo测一些性能、...

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

原文连接 http://blog.csdn.net/yanzi1225627/article/details/33028041 杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题...
  • shotaSu
  • shotaSu
  • 2016年01月28日 09:57
  • 995

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级。后来随着我自己的使用,越来越发现不出个升级版的demo是不行了。有时候就连我自己用这个demo测一些性能、...

android--Camera完整版--Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级。后来随着我自己的使用,越来越发现不出个升级版的demo是不行了。有时候就连我自己用这个demo测一些性能、...

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级。后来随着我自己的使用,越来越发现不出个升级版的demo是不行了。有时候就连我自己用这个demo测一些性能、...
  • lbaihao
  • lbaihao
  • 2016年09月30日 22:32
  • 789

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级。后来随着我自己的使用,越来越发现不出个升级版的demo是不行了。有时候就连我自己用这个demo测一些性能、...

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级。后来随着我自己的使用,越来越发现不出个升级版的demo是不行了。有时候就连我自己用这个demo测一些性能、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的Camera用SurfaceView拍照
举报原因:
原因补充:

(最多只允许输入30个字)