Android Camera.Parameters setPictureSize不起作用

时间:2015-09-24 08:27:44

标签: android camera android-camera

我正在尝试在相机对象中设置最佳输出图片尺寸。所以,我可以得到一个完美的缩小的样本图像并显示它。

在调试期间,我观察到我将输出图片大小设置为我屏幕尺寸的大小。但当我通过相机返回图像DecodeBounds时。我得到一些更大的数字!

此外,我没有将显示尺寸设置为预期的输出图像尺寸。下面给出了用于计算和设置输出图像尺寸的代码。

我将此代码用于API级别< 21,所以使用相机应该不是问题。

我不知道为什么我会这样做。在此先感谢您的帮助!

定义相机参数

Camera.Parameters parameters = mCamera.getParameters();
setOutputPictureSize(parameters.getSupportedPictureSizes(), parameters); //update paramters in this function.

//set the modified parameters back to mCamera
mCamera.setParameters(parameters);

最佳图片尺寸计算

private void setOutputPictureSize(List<Camera.Size> availablePicSize, Camera.Parameters parameters)
{
    if (availablePicSize != null) {

        int bestScore = (1<<30); //set an impossible value.
        Camera.Size bestPictureSize = null;

        for (Camera.Size pictureSize : availablePicSize) {

            int curScore = calcOutputScore(pictureSize); //calculate sore of the current picture size
            if (curScore < bestScore) { //update best picture size
                bestScore = curScore;
                bestPictureSize = pictureSize;
            }
        }
        if (bestPictureSize != null) {
            parameters.setPictureSize(bestPictureSize.width, bestPictureSize.height);
        }
    }
}

//calculates score of a target picture size compared to screen dimensions.
//scores are non-negative where 0 is the best score.
private int calcOutputScore(Camera.Size pictureSize)
{
    Point displaySize = AppData.getDiaplaySize();
    int score = (1<<30);//set an impossible value.

    if (pictureSize.height < displaySize.x || pictureSize.width < displaySize.y) {
        return score;  //return the worst possible score.
    }

    for (int i = 1; ; ++i) {

        if (displaySize.x * i > pictureSize.height || displaySize.y * i > pictureSize.width) {
            break;
        }
        score = Math.min(score, Math.max(pictureSize.height-displaySize.x*i, pictureSize.width-displaySize.y*i));
    }
    return score;
}

1 个答案:

答案 0 :(得分:2)

最后我经过多次尝试后解决了这个问题!以下是我的发现:

第1步。如果我们已在预览,请致电mCamera.stopPreview()

第2步。通过调用mCamera.setParameters(...)

设置修改后的参数

第3步。再次开始预览,请致电mCamera.startPreview()

如果我在不停止预览的情况下拨打mCamera.setParameters(假设相机正在预览)。相机似乎忽略了更新的参数。

我在经过多次跟踪和错误后想出了这个解决方案。任何人都知道在预览期间更新参数的更好方法请分享。