【问题标题】:Android camera - taken picture inconsistent with previewAndroid相机 - 拍摄的图片与预览不一致
【发布时间】:2014-06-07 14:47:30
【问题描述】:

我在 Android 上遇到了相机问题,基本上,当我使用 Camera 类拍照时,拍摄的输出图片实际上显示的不仅仅是预览。最好的表达方式是裁剪预览。我该如何解决这个问题?

我在 Samsung Galaxy S4、Samsung Galaxy S3、HTC One M8 和 Nexus One 上运行过该应用程序,都出现了同样的问题。 (所有运行 Android 4.0 ICS)

在没有操作栏和隐藏状态栏的 Activity 中,相机预览是全屏的。

我要创建的相机是纵向的,所以我将 displayOrientation 设置为 90。

我用于确定预览大小和输出照片大小的代码如下(我相信问题很可能出在某处):

public static Camera.Size getBestAspectPreviewSize(int displayOrientation,
                                                 int width,
                                                 int height,
                                                 Camera.Parameters parameters,
                                                 double closeEnough) {
double targetRatio=(double)width / height;
Camera.Size optimalSize=null;
double minDiff=Double.MAX_VALUE;

if (displayOrientation == 90 || displayOrientation == 270) {
  targetRatio=(double)height / width;
}

List<Size> sizes=parameters.getSupportedPreviewSizes();

Collections.sort(sizes,
                 Collections.reverseOrder(new SizeComparator()));

for (Size size : sizes) {
  double ratio=(double)size.width / size.height;

  if (Math.abs(ratio - targetRatio) < minDiff) {
    optimalSize=size;
    minDiff=Math.abs(ratio - targetRatio);
  }

  if (minDiff < closeEnough) {
    break;
  }
}

return(optimalSize);
}


 public static Camera.Size getLargestPictureSize(CameraHost host,
                                              Camera.Parameters parameters,
                                              boolean enforceProfile) {
Camera.Size result=null;

for (Camera.Size size : parameters.getSupportedPictureSizes()) {

  // android.util.Log.d("CWAC-Camera",
  // String.format("%d x %d", size.width, size.height));

  if (!enforceProfile
      || (size.height <= host.getDeviceProfile()
                             .getMaxPictureHeight() && size.height >= host.getDeviceProfile()
                                                                          .getMinPictureHeight())) {
    if (result == null) {
      result=size;
    }
    else {
      int resultArea=result.width * result.height;
      int newArea=size.width * size.height;

      if (newArea > resultArea) {
        result=size;
      }
    }
  }
}

if (result == null && enforceProfile) {
  result=getLargestPictureSize(host, parameters, false);
}

return(result);
 }

尺寸比较器类:

private static class SizeComparator implements
  Comparator<Camera.Size> {
@Override
public int compare(Size lhs, Size rhs) {
  int left=lhs.width * lhs.height;
  int right=rhs.width * rhs.height;

  if (left < right) {
    return(-1);
  }
  else if (left > right) {
    return(1);
  }

  return(0);
}
}

这是使用 cwac-camera 并使用 SimpleCameraHost,没有任何变化。

感谢任何帮助!

【问题讨论】:

    标签: android camera commonsware-cwac


    【解决方案1】:

    我该如何解决这个问题?

    如果您使用全出血预览,大多数情况下预览会被裁剪,因为CameraView 的纵横比不太可能与预览帧的纵横比匹配。

    引用the documentation:

    CameraFragmentCameraView 的原始默认行为是显示整个 预览,由底层Camera API 提供。由于纵横比 预览帧可能与CameraView 的纵横比不同, 这会产生“信箱”效果,其中背景将显示在 两侧各有一个轴。

    新的默认行为是完全填充CameraView,代价是 裁剪一些实际的预览帧,即所谓的“全出血预览” (从印刷媒体世界中窃取一些术语)。

    控制这种行为:

    • 有你的CameraHostuseFullBleedPreview()返回truefalse

    • 或者,拨打useFullBleedPreview() 在您的SimpleCameraHost.Builder 上,传入boolean 值以默认使用。

    请注意,本库拍摄的图片和视频不受 useFullBleedPreview()。因此,如果useFullBleedPreview() 返回true,则 图片或视频的边缘可能包含其他内容 在预览中可见。

    【讨论】:

    • 我已经让 useFullBleedPreview() 返回 false ,但我仍然有同样的问题。您认为这与缩放有关吗?还是因为预览被剪裁而拍摄的照片没有?
    • @DavidXu:如果您的预览没有更改,则说明有问题 - 要么您没有正确禁用全出血预览,要么库中存在错误。
    • 我已经在我的自定义 CameraHost 中覆盖了 useFullBleedPreview() 以返回 false,这还不够吗?
    • @DavidXu:应该是。您的预览是否显示“信箱”(即一侧的白条)?
    • 不,不是。屏幕完全充满了相机预览。在配备 4.0 ICS 的 Galaxy S4 上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多