相关疑难解决方法(0)

全屏相机显示/预览不保持纵横比 - 图像歪斜,拉伸以适合屏幕

我开发了一个小应用程序,用于全屏显示摄像头预览.我正在使用Camera API.

这是活动布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <!-- This is the container for the camera preview screen -->
    <FrameLayout android:id="@+id/camera_preview"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

当设备处于纵向状态时,显示器将垂直缩放以匹配设备屏幕的高度 - 因此纵横比与本机相机的纵横比不同.这些是2张图片,更好地解释了我所说的内容:

在此输入图像描述在此输入图像描述

第一张图像是使用原生相机设备制作的.第二张图片是用我的应用程序制作的,相机全屏 - 图像歪斜,拉伸以适应屏幕.

无论getSupportedPreviewSizes()mehod 提供的预览尺寸和无失真,我都需要将相机预览设置为全屏.有没有办法实现这个目标?当相机预览全屏时,有没有办法保持适当的宽高比?我希望这可以通过操作系统自动完成 - 裁剪图像以匹配所请求的分辨率,同时保持宽高比,但这不会发生.

我试图使SurfaceView显示器大于显示器(遵循这个问题:将相机预览适合大于显示器的SurfaceView),但在我的情况下不行,因为我捕获快照(6帧/秒)和那些不是用户在屏幕上看到的内容(框架包含所有相机预览,即使并非所有相机都在屏幕上可见).

我在这里发布:https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v = 0mcn我做的整个项目.

任何想法/解决方案对我来说都非常重要.非常感谢.

================================================== ======================

由于ss1271答案更新:

我将分析你为三星Galaxy Ace II上面写的一些分辨率.

I.屏幕分辨率:480x800 - 宽高比3:5 = 0,6

II.getSupportedPreviewSizes - 我几乎可以肯定这些值来自后置摄像头.以下是这些决议的方面比率:

   2560x1920   - 0,75

   2560x1536   - 0,60

   2048x1536   - 0,75

   2048x1232   - …
Run Code Online (Sandbox Code Playgroud)

android android-camera

31
推荐指数
1
解决办法
4万
查看次数

纵向模式下的相机setDisplayOrientation()打破纵横比

我试图让相机预览在纵向模式下正常工作,其中活动本身可以正常改变方向(即,不被锁定到风景).

但是,使用setDisplayOrientation()严重打破了预览的行为.

这可以通过谷歌自己的ApiDemos来证明.第一个图像基于示例项目CameraPreviewandroid-17版本ApiDemos,其中我做的唯一更改是android:orientation="landscape"从清单中的此活动的条目中删除.下图是运行Android 4.2的Nexus 4显示屏上显示的内容的屏幕截图,相机指向一张8.5平方英寸的纸张:

Nexus 4 ApiDemos预览,纵向模式

该预览中不明显的是它旋转了90度.您在图像最右侧看到的袜子包裹的脚实际上位于正方形下方.

对此,至少对于横向模式,解决方案是使用setDisplayOrientation().但是,如果修改了Preview内部类的CameraPreviewmCamera.setDisplayOrientation(90);,你会得到这样的:

Nexus 4 ApiDemos预览,纵向模式,带setDisplayOrientation(90)

值得注意的是,广场不再是正方形.

它使用与SurfaceView以前相同的大小.我已经使用其他一些代码重现了这个场景ApiDemos,并且我TextureView在该代码中得到了相同的行为.

我简单地想到问题可能是getSupportedPreviewSizes()基于可能会返回不同的值setDisplayOrientation(),但快速测试表明情况并非如此.

任何人都知道如何setDisplayOrientation()在纵向模式下工作而不会破坏图像的宽高比推到预览中?

谢谢!

android android-camera

15
推荐指数
1
解决办法
1万
查看次数

标签 统计

android ×2

android-camera ×2