我在Android上遇到相机问题,基本上当我用Camera类拍照时,拍摄的输出图像实际上显示的不仅仅是预览。放置它的最好方法是预览被裁剪。我该如何解决这个问题?
我在三星Galaxy S4,三星Galaxy S3,HTC One M8和Nexus One上运行应用程序,并且都展示了同样的问题。 (全部运行Android 4.0 ICS)
在没有操作栏且状态栏隐藏的活动中,相机预览全屏显示。
我正在尝试创建的相机是肖像,所以我将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而不做任何更改。
感谢任何帮助!
答案 0 :(得分:1)
我该如何解决这个问题?
如果您使用的是全出血预览,则在大多数情况下都会裁剪预览,因为CameraView
的宽高比不太可能与预览帧的宽高比相匹配。
CameraFragment
和CameraView
的原始默认行为是显示整个行为 预览,由基础Camera
API提供。由于纵横比 预览帧可能与CameraView
的宽高比不同, 这导致了一个&#34;信箱&#34;效果,背景将显示在哪里 两侧有一个轴。新的默认行为是完全填充
CameraView
,代价是。{ 裁剪一些实际的预览框架,即所谓的&#34;全出血预览&#34; (从印刷媒体世界窃取一些术语)。要控制此行为:
- 返回
拥有
CameraHost
从true
false
或useFullBleedPreview()
或致电
useFullBleedPreview()
在SimpleCameraHost.Builder
上,默认情况下传递boolean
值。请注意,此库拍摄的照片和视频不受影响
useFullBleedPreview()
。因此,如果useFullBleedPreview()
返回true
,那么。{ 图片或视频可能包含边缘上没有的其他内容 在预览中可见。