首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓相机-与预览不一致的照片

安卓相机-与预览不一致的照片
EN

Stack Overflow用户
提问于 2014-06-07 14:47:30
回答 1查看 837关注 0票数 0

我在Android上的摄像头有问题,基本上当我和照相机类拍照时,拍摄的输出图片实际上显示的比预览的要多。最好的方式,它将是预览是裁剪。我该怎么解决这个问题?

我在三星Galaxy S4、三星Galaxy S3、HTC One M8和Nexus One上运行了这个应用程序,所有这些都展示了同样的问题。(全部运行Android4.0 ICS)

相机预览是在一个没有动作栏和状态栏隐藏的活动中的全屏。

我想要制作的相机是肖像,所以我把displayOrientation设为90。

用于确定预览大小和输出图片大小的代码如下(我相信这里最有可能出现问题):

代码语言:javascript
复制
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);
 }

大小比较器类:

代码语言:javascript
复制
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相机和使用没有变化的SimpleCameraHost .

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-07 14:56:06

我该怎么解决这个问题?

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

引用文献资料

CameraFragmentCameraView的最初默认行为是显示整个预览,这是由底层的Camera API提供的。由于预览帧的纵横比可能与CameraView的纵横比不同,因此产生了“信箱”效应,其中背景将在两侧的一个轴上显示。 新的默认行为是完全填充CameraView,而代价是将一些实际预览框架裁剪掉,即所谓的“完全溢出预览”(从印刷媒体领域窃取一些术语)。 要控制此行为:

  • CameraHostuseFullBleedPreview()返回truefalse
  • 或者,在您的SimpleCameraHost.Builder上调用SimpleCameraHost.Builder,传递一个默认情况下要使用的boolean值。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24098388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档