Android 如何从定制的全屏幕前置摄像头获取全尺寸图像
我正在制作一个android应用程序,它使用的是设备的前置摄像头,它必须以肖像的形式拍摄照片。它还希望以与预览中显示的相同的结果保存照片,但当我拍摄照片并保存位图时,位图看起来非常笨拙,因为它增加了长度。似乎我做错了什么,在保存时挤压相机图片 我已经搜索了很多链接,并且知道我们必须为此设置纵横比。所以我没有得到它。我想在编码方面得到帮助,因为我即将完成我的应用程序,它在三星grand和S4上运行得最好,但在Lg g3和S3上运行得不好 下面是我在surfaceview课堂上所做的。我正在分享唯一的surface view类,因为我知道这里有问题,其他类很简单。 CameraPreview.java 请记住,我只使用前置摄像头。请帮助我在它如何我可以采取全长图像从前面的相机没有得到任何其他角度倒转,然后肖像Android 如何从定制的全屏幕前置摄像头获取全尺寸图像,android,camera,android-camera,Android,Camera,Android Camera,我正在制作一个android应用程序,它使用的是设备的前置摄像头,它必须以肖像的形式拍摄照片。它还希望以与预览中显示的相同的结果保存照片,但当我拍摄照片并保存位图时,位图看起来非常笨拙,因为它增加了长度。似乎我做错了什么,在保存时挤压相机图片 我已经搜索了很多链接,并且知道我们必须为此设置纵横比。所以我没有得到它。我想在编码方面得到帮助,因为我即将完成我的应用程序,它在三星grand和S4上运行得最好,但在Lg g3和S3上运行得不好 下面是我在surfaceview课堂上所做的。我正在分享唯一
我以前见过这个问题,但其中的答案并不那么清楚和令人信服
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Camera camera;
public static SurfaceHolder holder;
private Activity activity;
public CameraPreview(Context context, AttributeSet attrs, Activity activity) {
super(context, attrs);
}
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CameraPreview(Context context) {
super(context);
}
public void init(Camera camera,Activity activity) {
this.camera = camera;
this.activity = activity;
initSurfaceHolder();
}
@SuppressWarnings("deprecation") // needed for < 3.0
private void initSurfaceHolder() {
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera(holder);
}
private void initCamera(SurfaceHolder holder) {
try {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = previewSizes.get(0); //480h x 720w
for(int i = 0 ; i<=6;i++){
Log.v("preview sizes"+previewSizes.get(i));
Camera.Size previewSizedemo = previewSizes.get(i);
Log.v("preview size are" +previewSizedemo.width+""+ previewSizedemo.height+"of"+i);
Camera.Size previewSizedemo1 = previewSizes.get(1);
Log.v("preview size of 0 is" +previewSizedemo1.width+""+ previewSizedemo1.height);
}
parameters.setPreviewSize(previewSize.width,previewSize.height);
parameters.setZoom(Camera.Parameters.FOCUS_DISTANCE_OPTIMAL_INDEX);
camera.setParameters(parameters);
requestLayout();
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (Exception e) {
Log.d("Error setting camera preview", e);
}
}
@Override
public void surfaceChanged(SurfaceHolder mHolder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = previewSizes.get(0); //480h x 720w
parameters.setPreviewSize(previewSize.width,previewSize.height);
requestLayout();
camera.setParameters(parameters);
Display display = ((WindowManager)activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0) {
camera.setDisplayOrientation(90);
parameters.setPreviewSize(previewSize.width, previewSize.height);
} else if(display.getRotation() == Surface.ROTATION_270) {
camera.setDisplayOrientation(180);
parameters.setPreviewSize(previewSize.width, previewSize.height);
}
camera.startPreview();
}// end surfaceChanged
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e("TABACT"+"surfaceDestroyed()");
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
this.getHolder().removeCallback(this);
}
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio=(double)h / w;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}