android Camera与SurfaceView联合使用时出现图片被拉伸解决方案

用到系统相机,但是会出现图片被拉伸了怎么办呢?不要慌,下面就给出解决方法。

//初始化并打开相机
private void initAndStartCamera() {
    //判断是否有相机
    if (MyCameraUtils.checkCameraHardware(context)) {
        try {
            stopAndReleaseCamera();

            //打开照相机,默认打开后置相机
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);

            //填充相机预览界面
            mCamera.setPreviewDisplay(sfvCameraPerview.getHolder());

            //设置相机预览方向
            mCamera.setDisplayOrientation(90);


            //给照相机设置参数
            Camera.Parameters parameters = mCamera.getParameters();
            Display display = getWindowManager().getDefaultDisplay();
            int height = display.getWidth();
            int width = display.getHeight();
            Camera.Size size = getBestPreviewSize(width, height);
            try {
                parameters.setPictureSize(size.width, size.height);
                parameters.setPreviewSize(size.width, size.height);
                mCamera.setParameters(parameters);
            } catch (Exception e) {

                try {
                    parameters.setPictureSize(size.width, size.height);
                    mCamera.setParameters(parameters);
                } catch (Exception e1) {

                }
            }

            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    if (focus) {
                        mPreviewData = data;
                    }
                }
            });

            //开启预览
            mCamera.startPreview();


        } catch (Exception e) {

        }
    } else {
        LogUtils.d(TAG, "手机没有相机功能");
    }
}

//获取手机分辨率最佳显示大小

private Camera.Size getBestPreviewSize(int width, int height) {

    Camera.Size result = null;

    final Camera.Parameters p = mCamera.getParameters();

    //特别注意此处需要规定rate的比是大的比小的,不然有可能出现rate = height/width,但是后面遍历的时候,current_rate = width/height,所以我们限定都为大的比小的。

    float rate = (float) Math.max(width, height) / (float) Math.min(width, height);

    float tmp_diff;

    float min_diff = -1f;

    for (Camera.Size size : p.getSupportedPreviewSizes()) {

        float current_rate = (float) Math.max(size.width, size.height) / (float) Math.min(size.width, size.height);

        tmp_diff = Math.abs(current_rate - rate);

        if (min_diff < 0) {

            min_diff = tmp_diff;

            result = size;

        }

        if (tmp_diff < min_diff) {

            min_diff = tmp_diff;

            result = size;

        }
    }
    return result;
}
//重置相机
private void stopAndReleaseCamera() {
    if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.setPreviewCallback(null);
        mCamera.release();
        mCamera = null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_41620230

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值