android - 在 Android 中正确的纵横比

标签 android android-camera aspect-ratio

我正在开发一个在 SurfaceView 上绘制相机的应用程序。一开始我发现观点有问题。它们没有正确显示。所以我用下面的方法来修正宽高比问题:

注意:此方法可在多个地方找到,作为校正 Android 相机纵横比的方法。

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio;

    // Check wheter is portrait or landscape
    if (orientation == 1)
        targetRatio = (double) h / w;
    else
        targetRatio = (double) w / h;

    if (sizes == null)
        return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // Try to find an size match aspect ratio and size
    for (Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
            continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    // Cannot find the one match the aspect ratio, ignore the requirement
    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}

这很完美,我的相机显示正确。但我发现较新的设备存在问题,例如 LG G3。它有一个该方法认为最合适的分辨率,但它在纵向模式下显示带有邮筒的图像,如下图所示:

enter image description here

为什么会这样?我该如何解决纵向模式下的这个邮筒?

最佳答案

除非该代码中存在错误,否则您将获得可能的“最佳”结果。

不能保证手机摄像头的纵横比与手机屏幕的纵横比相匹配。

这只是决定最佳结果的标准的问题。该代码是谷歌的建议,用于确定在手机屏幕上显示的最佳相机分辨率。

您可能不同意 Google。在这种情况下,您将需要编写自己的算法来确定最佳相机分辨率。您可以针对宽高比或沿宽度或高度的分辨率进行优化。您可以尝试适合屏幕,或者您可以裁剪图像的一些部分以填满整个屏幕。这取决于你。

注意:您发布的代码试图找到在屏幕宽高比的 10% 以内的相机分辨率并且具有与最接近的屏幕相匹配的高度。 如果在屏幕宽高比的 10% 范围内没有摄像头分辨率,那么它会选择高度与屏幕最接近的摄像头分辨率。在这种情况下,您会在邮筒周围看到明显的黑条。

关于android - 在 Android 中正确的纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27057428/

相关文章:

xaml - 两种纵横比的两种布局 (4 :3 and 16:9) - changing automatically

android - Android 中是否可以检测 Whatsapp 语音通话结束?

android - .apk 不包含当前图标 - 为什么?

java - LibGDX:如何在FitViewport的黑条区域中绘制?

android - 模拟器在拍摄照片时崩溃(NullPointerException)

Android Camera2 API - 设置 AE 区域不起作用

css - 如何保持 ionic 卡的纵横比

android - 从存储访问框架中的文档 ID 获取文件 URI

android - android中的pidstat命令?

Android Camera.Parameters setPictureSize 不起作用