我开发了一个小应用程序,用于全屏显示摄像头预览 . 我正在使用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>
当设备处于纵向状态时,显示器将垂直缩放以匹配设备屏幕的高度 - 因此纵横比与本机相机的纵横比不同 . 这些是2张图片,更好地解释了我所说的内容:
第一张图像是使用原生相机设备制作的 . 第二张图片是用我的应用程序制作的,相机全屏 - 图像歪斜,拉伸以适应屏幕 .
我需要全屏显示相机,无论 getSupportedPreviewSizes()
mehod给出的预览尺寸如何且没有失真 . 有没有办法实现这个目标?当相机预览全屏时,有没有办法保持适当的宽高比?我希望这可以通过操作系统自动完成 - 裁剪图像以匹配所请求的分辨率,同时保持宽高比,但这不会发生 .
我试图使 SurfaceView
大于显示器(跟随这个问题:Fitting a camera preview to a SurfaceView larger than the display),但在我的情况下不行,因为我捕获快照(6帧/秒)并且那些不是用户在屏幕上看到的(框架包含所有相机预览,即使并非所有相机都在屏幕上可见 .
我在这里发布了:https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v=0mcn我做过的整个项目 .
任何想法/解决方案对我来说都非常重要 . 非常感谢 .
================================================== ======================
Update due to ss1271 answer:
我将分析你上面为 Samsung Galaxy Ace II 写的一些分辨率 .
I. Screen resolution :480x800 - 宽高比3:5 = 0,6
II. getSupportedPreviewSizes - 我几乎可以肯定这些值来自后置摄像头 . 以下是这些决议的方面比率:
2560x1920 - 0,75
2560x1536 - 0,60
2048x1536 - 0,75
2048x1232 - 0,60
960x720 - 0,75
640x480 - 0,75
因此,您的方法将返回 Size
,对应于 2560x1536 或 2048x1232 - 这些具有与屏幕分辨率相同的宽高比,并且使用这些值不会使图片失真 . 对我来说问题是我不能使用如此大的分辨率,因为我捕获6帧/秒,这些需要以较低的分辨率保存 .
我将在下面介绍 Samsung S2 设备的一些结果:
I. Screen resolution :480 x 800 - 纵横比3:5 = 0,6
II. Back camera
一个) . getSupportedPreviewSizes
:
800 / 480 - 480/800 = 0,60
800 / 450 - 450/800 = 0,56
720 / 480 - 0,66
640 / 480 - 0,75
352 / 288 - 0,81
320 / 240 - 0,75
176 / 144 - 0,81
B) . 原生相机分辨率:
3264 / 2448 - 0,75 - not full screen
3264 / 1968 - 0,60 - FULL SCREEN (since has the same aspect ratio as device screen)
2048 / 1536 - 0,75 - not full screen
2048 / 1232 - 0,60 - FULL SCREEN (same aspect ratio as device screen)
800 / 480 - 0,60 - FULL SCREEN (same aspect ratio as device screen)
640 / 480 - 0, 75 - not full screen
III. Front camera
一个) . getSupportedPreviewSizes
:
640 / 480 - 0,75
352 / 288 - 0,81
320 / 240 - 0,75
176 / 144 - 0,81
B) . 原生相机不是全屏,我无法选择分辨率 - 该选项被禁用 .
对于S2,后置摄像头,我想知道为什么 getSupportedPreviewSizes()
方法不能像Native相机那样返回相同的分辨率,或者原生相机显示的分辨率是图片大小?我想知道为什么我没有像 getSupportedPreviewSizes()
方法给出的3264 / 1968,2048 / 1232这样的选项? :
2 回答
简而言之,您可以全屏进行相机预览,但是您需要自己在所支持的预览尺寸中找到合适的尺寸,只有自定义相机预览才是您想要的 .
对于你的问题,根据Android Developers -- Camera
看起来你不能手动传递你想要的尺寸而不是
getSupportedPreviewSizes()
提供的尺寸 . 仔细检查您的手机摄像头支持的尺寸,您的比例为_2846743 .例如,三星Galaxy Ace II拥有480x800分辨率的屏幕,通过阅读从
getSupportedPreviewSizes()
返回的Size
,其相机支持:如果要正确显示全屏幕的相机预览(无拉伸),则需要在这些支持的预览尺寸中计算,比较和应用合适的比例 .
找到合适的预览尺寸的实现并不复杂 . 执行此操作的常用方法是这样的:
你也可以做类似的找出合适的相机尺寸(输出图片尺寸) .
注意:我从Internet上找到了上面代码的原始版本,我为自己的目的做了一些修改/优化 .
如果这对你有用,请告诉我 .
我在Camera2 API中面临同样的问题,我已经使用过了Preview size and devices aspect ratio解决问题 . 您也可以使用Camera API执行相同的操作 .