相机表面视图图像看起来拉伸

在纵向模式下,图像看起来垂直拉伸,在横向模式下,它看起来水平拉伸。

虽然捕获图像后显示的大小合适

如何解决这个问题?

您需要选择与显示尺寸相匹配的预览尺寸。 我建议更改预览大小设置以匹配SurfaceView而不是相反。 虽然预览数据很好,但它没有扭曲,当它投射到具有不同宽高比的表面时会看起来扭曲。

如果您有全屏视图,那么您应该会发现相机的预览尺寸与该尺寸相匹配 – 至少会有一个具有相同宽高比的相机。 例如,如果您的屏幕是640×480,那么320×240预览尺寸将不会在全屏SurfaceView上拉伸。

您必须根据(1)可用的预览尺寸(2)视图来约束预览尺寸。 如果您仍然需要,我的解决方案如下:

 private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); mCamera = camera; // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); // deprecated setting, but required on Android versions prior to 3.0 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } private void startPreview() { try { /** * Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987 */ Camera.Parameters parameters = mCamera.getParameters(); List previewSizes = parameters.getSupportedPreviewSizes(); Camera.Size previewSize = null; float closestRatio = Float.MAX_VALUE; int targetPreviewWidth = isLandscape() ? getWidth() : getHeight(); int targetPreviewHeight = isLandscape() ? getHeight() : getWidth(); float targetRatio = targetPreviewWidth / (float) targetPreviewHeight; Log.v(TAG, "target size: " + targetPreviewWidth + " / " + targetPreviewHeight + " ratio:" + targetRatio); for (Camera.Size candidateSize : previewSizes) { float whRatio = candidateSize.width / (float) candidateSize.height; if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) { closestRatio = whRatio; previewSize = candidateSize; } } Log.v(TAG, "preview size: " + previewSize.width + " / " + previewSize.height); parameters.setPreviewSize(previewSize.width, previewSize.height); mCamera.setParameters(parameters); mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (IOException e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } } } 

我在调用camera.startPreview()之前添加了这个来修复它:

 Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(yourSurfaceView.getWidth(), yourSurfaceView.getHeight()); camera.setParameters(parameters); 

它可能对某人有帮助。

解决方案很简单! 如果你在actionbar下使用surfaceview,这可能是问题所在。 我使用这一行,我可以修复,但我不测试使用操作栏。

用这个:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

如果您正在谈论预览,请尝试将SurfaceView的大小设置为与相机的预览大小相同。 这样,预览不应缩放。