安卓相机在横向模式下拉伸

2022-09-01 23:21:27

我正在编写的应用需要相机功能。因此,为了学习如何操作相机,我遵循以下脚本:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

我已将活动放在我的清单中,并在横向模式下设置其屏幕方向。

我遇到的问题是,当相机侧向握住时(所以我将Galaxy Tab P1000保持在横向位置),视图会伸展。

为了更具体地说明我的脚本,我使用了Google制作的代码的精确副本。它可以在 android-sdk\samples\android-8\ApiDemos\src\com\example\android\apis\graphics\ 中找到。

该文件本身称为 CameraPreview。

我真的不知道为什么屏幕看起来如此拉伸。当然,格式很奇怪,不是方形的,但是,当使用设备上安装的默认相机应用程序时,它根本不会变形。当我侧身握住图像并稍微移动相机时,这台相机会使图像变形。

enter image description here

enter image description here

我所做的是:我按住我的Galaxy标签拍摄一个物体(在这种情况下是笔记本电脑)的照片,然后用我的手机拍摄了我的Galaxy照片。在Galaxy上,我在我正在制作的应用程序中打开了相机屏幕。这对于两个图像都很重要。一个我侧向握住,另一个我在纵向视图中握住。照片有点不清楚,但你可以看到在风景图片中,相机已经变得非常宽。


答案 1

我昨天也遇到了同样的问题。在研究了“相机”来源之后,我发现了相机预览被拉伸的原因。

原因是:SurfaceView 纵横比(宽度/高度)必须与预览参数中使用的 Camera.Size 纵横比相同。如果宽高比不一样,你就有了拉伸的图像。

因此,最快的解决方法是将SurfaceView设置为320px x 240px - Parameters.getSupportedPreviewSizes()中支持的最小支持大小。

此外,您可以查看相机标准应用程序源,它使用自定义布局来控制SurfaceView大小(请参阅PeliaseFrameLayout.java,onMeasure()功能)。

git clone https://android.googlesource.com/platform/packages/apps/Camera.git

以获取相机源。


答案 2
public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

        try {
            camera = Camera.open();

            camera.setDisplayOrientation(90);
            camera.setPreviewDisplay(holder);
            Camera.Parameters parameters = camera.getParameters();
            List<Size> sizes = parameters.getSupportedPictureSizes();
            parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0
            parameters.set("orientation","portrait");
            //parameters.setPreviewSize(viewWidth, viewHeight);
            List<Size> size = parameters.getSupportedPreviewSizes();
            parameters.setPreviewSize(size.get(0).width, size.get(0).height);
            camera.setParameters(parameters);
            camera.startPreview();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

您只需要并将其保存到:getSupportedPreviewSizes()List

List<Size> size = parameters.getSupportedPreviewSizes();
            parameters.setPreviewSize(size.get(0).width, size.get(0).height);
            camera.setParameters(parameters); 



camera.startPreview(); 

我希望这对你有所帮助。


推荐