我开发了一个小应用程序,在全屏显示相机预览。我使用的是摄像头 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>
当设备处于竖屏状态时,为了匹配设备屏幕的高度,显示会进行垂直缩放,因此宽高比与原生相机不同。以下是两张图片更好地说明了我的意思:
第一张图片是使用原生相机设备拍摄的。 第二张图片是使用我的应用程序,并使用全屏相机拍摄的 - 图像被扭曲,拉伸以适应屏幕。
我需要相机预览全屏显示,而不考虑由 getSupportedPreviewSizes()
方法给出的预览大小,并且无失真。有没有办法实现这一点?在相机预览处于全屏状态时保持正确的宽高比?我期望操作系统自动完成这项工作 - 裁剪图像以匹配所请求的分辨率同时保持宽高比,但这并没有发生。
我尝试将 SurfaceView
设为大于显示器的尺寸(按照这个问题:Fitting a camera preview to a SurfaceView larger than the display),但在我的情况下不行,因为我要捕获快照(每秒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 - 0,60
960x720 - 0,75
640x480 - 0,75
因此,您的方法将返回一个
Size
,对应于2560x1536或2048x1232 - 这些具有与屏幕分辨率相同的纵横比,使用这些值不会扭曲图片。对我而言问题在于,由于我每秒捕获6帧,需要以较低的分辨率保存这些帧。下面是一些来自三星S2设备的结果: I. 屏幕分辨率:480 x 800 - 纵横比3:5 = 0.6 II.后置摄像头 a).
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. 前置摄像头
a). getSupportedPreviewSizes
:
640 / 480 - 0,75
352 / 288 - 0,81
320 / 240 - 0,75
176 / 144 - 0,81
b). 本地相机非全屏,无法选择分辨率-选项被禁用。
对于S2后置摄像头而言,我想知道为什么getSupportedPreviewSizes()
方法没有返回与本地相机相同的分辨率或本地相机显示的是图片大小?我想知道为什么我没有像getSupportedPreviewSizes()
方法中给出的3264 / 1968、2048 / 1232等选项?
![enter image description here](https://istack.dev59.com/fliSf.webp)
getSupportedPreviewSizes()
返回预览尺寸,而getSupportedPictureSizes()
将返回支持的图片尺寸。根据我的经验,对于您更新的问题,三星Galaxy设备在使用前置摄像头时似乎更有可能拉伸预览图像。但实际上,通过比较长宽比以找到最优尺寸(这就是为什么我在我的回答中有一个getOptimalSize
)可以使差异尽可能小。 - dumbfingers