Android相机的预览大小和图片大小有什么区别

时间:2017-02-08 05:01:51

标签: android camera android-camera

在使用相机的应用中,我需要显示相机的预览,我可以通过获取所有支持的预览尺寸来设置预览尺寸并找到最佳尺寸。我还应该为相机设置最佳图片尺寸吗?如果是这样,预览尺寸和图片尺寸之间有什么区别?

目前我使用以下内容找到最佳预览尺寸

int minDiff = Integer.MAX_VALUE;
for (SizePair sizePair : validPreviewSizes) {
  Size size = sizePair.previewSize();
  int diff =
      Math.abs(size.getWidth() - desiredWidth) + Math.abs(size.getHeight() - desiredHeight);
  if (diff < minDiff) {
    selectedPair = sizePair;
    minDiff = diff;
  }
}

使用此方法会在某些手机中提供错误的预览尺寸。有人可以建议一个更好的逻辑来获得最佳的preivew大小吗?

2 个答案:

答案 0 :(得分:7)

图片尺寸这是您告诉相机拍照时产生的图像尺寸。如果它与原始分辨率具有相同的宽高比,那么它将直接从该缩放比例缩放。如果纵横比不同,则将从原始尺寸裁剪。根据我的经验,getSupportedPictureSizes返回的最大尺寸是相机的原始分辨率。

预览尺寸这是屏幕上显示的图像预览的尺寸。它可能是与原始大小或图片大小不同的纵横比,导致进一步裁剪

要获得您在屏幕上看到的内容与拍摄照片时产生的图像之间最接近的匹配,请尝试选择宽高比尽可能接近您的图片尺寸宽高比的预览尺寸&# 39;已选中。我通常会尝试尽可能接近本机大小。

请同时查看this link

答案 1 :(得分:2)

Lalit解释了相机上图片尺寸和预览尺寸的区别。您可以尝试使用此方法来获得与设备屏幕大小相关的最佳大小。

private Camera.Size getOptimalSize(Camera.Parameters params, int w, int h) {

    final double ASPECT_TH = .2; // Threshold between camera supported ratio and screen ratio.
    double minDiff = Double.MAX_VALUE; //  Threshold of difference between screen height and camera supported height.
    double targetRatio = 0;
    int targetHeight = h;
    double ratio;
    Camera.Size optimalSize = null;

    // check if the orientation is portrait or landscape to change aspect ratio.
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        targetRatio = (double) h / (double) w;
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        targetRatio = (double) w / (double) h;
    }

    // loop through all supported preview sizes to set best display ratio.
    for (Camera.Size s : params.getSupportedPreviewSizes()) {

        ratio = (double) s.width / (double) s.height;
        if (Math.abs(ratio - targetRatio) <= ASPECT_TH) {

            if (Math.abs(targetHeight - s.height) < minDiff) {
                optimalSize = s;
                minDiff = Math.abs(targetHeight - s.height);
            }
        }
    }
    return optimalSize;
}