我的应用程序使用表面支架打开相机。相机将以默认预览尺寸打开。在某些设备上,默认预览大小会捕获比屏幕上实际可见的图像更多的图像。为了避免这种情况,我开始自己设置预览大小。标准是从可用的尺寸列表中选择预览尺寸,该尺寸最接近屏幕的宽度。
这在大多数情况下效果很好。但我经常偶然发现一些不喜欢我选择的预览尺寸的设备。
1)Nexus 4没有捕获我选择的预览尺寸之一的图像。 2)三星S 4沿拍摄的图像提供线条(噪声)。
所以我想了解我是否正在做任何违反标准的事情。以下是我的问题: -
1)我正在使用表面支架打开相机。有没有其他方法可以在我的应用程序中使用相机硬件。
2)我从可用尺寸列表中选择预览尺寸。在选择任何尺寸之前,我应该寻找哪些具体的东西?选择尺寸的逻辑如下: -
private Camera.Size getBestPreviewSize(int width, int height)
{
List<Size> sizes = camera.getParameters().getSupportedPreviewSizes();
if (sizes == null) return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = height;
int targetWidth = width;
int minWidthDiff = 0;
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.width - targetWidth) < minDiff) {
if(size.width > width) {
if (minWidthDiff == 0) {
minWidthDiff = size.width - width;
optimalSize = size;
}
else if (Math.abs(size.width - targetWidth) < minWidthDiff) {
minWidthDiff = size.width - width;
optimalSize = size;
}
minDiff = Math.abs(size.width - targetWidth);
}
}
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
任何有关这方面的指示都会有所帮助。
谢谢!! GAGAN
答案 0 :(得分:10)
使用相机时,您需要考虑几种不同的尺寸:
传感器尺寸 相机具有原始分辨率和宽高比,由硬件决定。
图片尺寸
这是您告诉相机拍照时产生的图像尺寸。如果它与原始分辨率具有相同的宽高比,那么它将直接从该缩放比例缩放。如果纵横比不同,则将从原始尺寸裁剪。根据我的经验,getSupportedPictureSizes
返回的最大尺寸是相机的原始分辨率。
预览尺寸 这是屏幕上显示的图像预览的大小。它可以是与原始大小或图片大小不同的纵横比,从而导致进一步裁剪。
要获得您在屏幕上看到的内容与拍摄照片时产生的图像之间最接近的匹配,请尝试选择宽高比尽可能接近您的照片尺寸宽高比的预览尺寸选择了。我通常会尝试尽可能接近本机大小。