安卓:拍摄的照片比preVIEW更大 [英] Android: Taken photo is bigger than the preview
问题描述
我试图捕捉直接使用摄像头API的照片,但这是preVIEW我得到:
I'm trying to capture photos directly using the camera api, but this is the preview I got:
&安培;这是在调用后所拍摄的影像 takePicture()
这是比preVIEW本身更大:
& this is the image taken after calling takePicture()
which is bigger than the preview itself:
(注意:我裁剪的previous的高度,2张照片,以提高可读性的问题,和放大器;不停的宽度为)
(note: I cropped the height of the previous 2 photos to enhance question readability, & kept the width as is)
我使用这个工具方法启动相机preVIEW之前选择最佳的图像preVIEW尺寸:
I'm using this utility method to choose best optimal preview size before starting the camera preview:
public static Camera.Size getBestAspectPreviewSize(int displayOrientation,
int width,
int height,
Camera.Parameters parameters) {
double targetRatio = (double) width / height;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
if (displayOrientation == 90 || displayOrientation == 270) {
targetRatio = (double) height / width;
}
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Collections.sort(sizes,
Collections.reverseOrder(new SizeComparator()));
for (Camera.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 < 0.0d) {
break;
}
}
return (optimalSize);
}
&安培;这种方法来选择合适的画面尺寸:
& this method to choose a suitable picture size:
public static Camera.Size getBiggestSafePictureSize(Camera.Parameters parameters) {
Camera.Size result = null;
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = Runtime.getRuntime().maxMemory() - used;
for (Camera.Size size : parameters.getSupportedPictureSizes()) {
int newArea = size.width * size.height;
long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :) )
if (neededMemory > availableMemory)
continue;
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
if (newArea > resultArea) {
result = size;
}
}
}
return (result);
}
&安培;这是在布局相机preVIEW元素:
& this is the camera preview element in the layout:
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/cameraPreview"></FrameLayout>
&安培;我下面的官方文档了解创建相机preVIEW本身
& I'm following the official documentation for creating the camera preview itself
那么,如何强制相机preVIEW显示将要采取的确切的照片?
So, how to force the camera preview to show the exact photo that will be taken?
推荐答案
最后,我发现它:)
href=\"http://stackoverflow.com/a/12118760/905801\">回答&安培;我引述如下:
according to this answer & I quote:
虽然典型照相机是一个的 4:3 强>纵横比,则preVIEW也可以是在5提供:3和16:9的比例,这似乎对通过实际扩展来实现水平视场...
While the typical camera is a 4:3 aspect ratio, the preview may also be available in 5:3 and 16:9 ratios and this seems to be accomplished by actually extending the horizontal field of view...
因此,我们需要找到一个preVIEW大小和放大器;图像尺寸,无论是 4:3 宽高比能够利用相机的全角,所以我改变了我的code这样的:
So we need to find a preview size & a picture size, both with 4:3 aspect ratio to be able to utilize the full angle of the camera, so I changed my code like this:
public static Camera.Size determineBestPreviewSize(Camera.Parameters parameters) {
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
return determineBestSize(sizes);
}
public static Camera.Size determineBestPictureSize(Camera.Parameters parameters) {
List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
return determineBestSize(sizes);
}
protected static Camera.Size determineBestSize(List<Camera.Size> sizes) {
Camera.Size bestSize = null;
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = Runtime.getRuntime().maxMemory() - used;
for (Camera.Size currentSize : sizes) {
int newArea = currentSize.width * currentSize.height;
long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :) )
boolean isDesiredRatio = (currentSize.width / 4) == (currentSize.height / 3);
boolean isBetterSize = (bestSize == null || currentSize.width > bestSize.width);
boolean isSafe = neededMemory < availableMemory;
if (isDesiredRatio && isBetterSize && isSafe) {
bestSize = currentSize;
}
}
if (bestSize == null) {
return sizes.get(0);
}
return bestSize;
}
这篇关于安卓:拍摄的照片比preVIEW更大的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!