Android 修改相机预览图片尺寸大小

在开发 Android 应用时,摄影相关的功能常常需要对相机预览的图片进行处理,包括修改图片的尺寸。理解如何控制预览图片的大小,有助于提高应用的性能和用户体验。本文将介绍如何在 Android 中修改相机预览图片的尺寸,并提供相关的代码示例。

一、相机预览基础

Android 提供了 CameraCamera2 API 来访问相机功能。我们以 Camera2 API 为例,这是一种更灵活、更高效的 API,适用于大多数现代 Android 设备。

安装依赖

首先,你需要在 build.gradle 文件中添加相机相关的权限。

android {
    ...
    defaultConfig {
        ...
        minSdkVersion 21  // Camera2 API requires API 21 or above
    }
}

dependencies {
    implementation 'androidx.camera:camera-core:1.0.1'
    implementation 'androidx.camera:camera-camera2:1.0.1'
    implementation 'androidx.camera:camera-lifecycle:1.0.1'
}

权限申请

为了能够使用相机,确保在 AndroidManifest.xml 中添加如下权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>

有必要在运行时请求相机权限。可以参考以下代码:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}

二、设置相机预览尺寸

使用 Camera2 API 时,我们能够以高度自定义的方式来设置相机的预览大小。一个关键步骤是获取支持的预览尺寸列表,然后选择一个适合的尺寸。

获取支持的预览尺寸

在设置相机预览之前,我们需要获取设备支持的预览尺寸。以下是一个获取支持的小函数:

private Size chooseOptimalSize(Size[] choices, int width, int height) {
    List<Size> bigEnough = new ArrayList<>();
    for (Size option : choices) {
        if (option.getWidth() >= width && option.getHeight() >= height) {
            bigEnough.add(option);
        }
    }
    
    if (bigEnough.size() > 0) {
        return Collections.min(bigEnough, new CompareSizesByArea());
    } else {
        return choices[0];
    }
}

private static class CompareSizesByArea implements Comparator<Size> {
    @Override
    public int compare(Size lhs, Size rhs) {
        return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() * rhs.getHeight());
    }
}

三、创建相机预览

创建相机预览时,我们指定选中的尺寸并在 SurfaceView 上进行绘制。例如:

private void startPreview() {
    try {
        CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
        StreamConfigurationMap map = characteristics.get(SCALER_STREAM_CONFIGURATION_MAP);
        
        Size[] jpegSizes = null;
        if (map != null) {
            jpegSizes = map.getOutputSizes(ImageFormat.JPEG);
        }
        
        Size optimalSize = chooseOptimalSize(jpegSizes, width, height);
        
        // 创建预览请求
        CaptureRequest.Builder previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        // 设置图像格式和尺寸
        previewRequestBuilder.addTarget(surface);
        cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                // 开始预览
                try {
                    session.setRepeatingRequest(previewRequestBuilder.build(), null, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

四、如何展示并分析预览尺寸的选择

按照上述的设置方式,我们通过获取支持的预览尺寸并选取合适的尺寸进入相机预览。下面利用饼状图展示预览尺寸的选择过程。

pie
    title 预览尺寸选择
    "小尺寸": 20
    "中尺寸": 30
    "大尺寸": 50

五、小结

通过本文的介绍,我们探讨了如何在 Android 的相机应用中修改和选择预览图片的尺寸。通过获取支持尺寸并进行动态选择,可以更好地满足不同终端的需求。此外,合理的尺寸选择将极大地提升应用的性能,让用户体验更为流畅。

希望本文对你理解 Android 相机预览的尺寸调整有所帮助!更多详细的信息和代码请参考官方文档和 GitHub 上的开源项目。在开发的过程中,欢迎尝试并优化你自己的相机应用!