【问题标题】:android camera stretched in landscape mode安卓相机在横向模式下拉伸
【发布时间】:2011-11-26 17:02:12
【问题描述】:

我正在编写的应用程序需要相机功能。 所以为了学习如何操作相机,我按照这个脚本:

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。

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

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

【问题讨论】:

  • T_T 那么我是世界上唯一有这个问题的人吗? <:>
  • 我也遇到了这个问题...
  • 这个问题是一个隐藏的宝石!我很难找到这个。使用了谷歌中的所有关键字。这个问题救了我的命。

标签: java android camera landscape stretched


【解决方案1】:

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

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

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

另外,您可以查看 Camera 标准应用程序源,它使用自定义布局来控制 SurfaceView 大小(参见 PreviewFrameLayout.java,onMeasure() 函数)。

使用

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

获取相机来源。

【讨论】:

  • +1 用于描述实际问题。您可以在surfaceChanged中找到SurfaceView的高度和宽度,然后在Camera参数对象上使用getSupportedPreviewSizes找到最接近的匹配并将SurfaceView设置为所需的可接受大小。
  • 我正在这样做,但不起作用。 private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { Camera.Size result = null; for (Camera.Size size : parameters.getSupportedPreviewSizes()) { if (size.width resultArea) { 结果 = 大小; } } } } 返回(结果); }
  • 您的代码只是在搜索适合初始宽度和高度的最大预览尺寸。当然你有拉伸屏幕的问题,因为最大并不意味着“最佳纵横比”。您需要通过调整其宽度或高度来将预览视图大小调整为“最大”大小,这样,对于初始值(宽度、高度)和最终值(result.width、结果.高度)
【解决方案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(); 

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多