【问题标题】:How does PreviewView fill-scaling handle images which are higher resolution than the view?PreviewView 填充缩放如何处理比视图分辨率更高的图像?
【发布时间】:2021-06-29 09:26:22
【问题描述】:

在处理PreviewView“FILL”缩放类型(例如PreviewView.ScaleType.FILL_CENTER)时,the docs 似乎暗示如果图像的分辨率高于视图,​​则不会缩放。

缩放预览,保持源宽高比,使其填充整个PreviewView,并在视图中居中

如果图像的分辨率低于视图,我可以理解为什么要缩放图像,否则必须有黑色边框(即不会填充整个视图),FILL 保证不会显示。在图像分辨率高于视图的情况下,预览图像已经填满了整个视图(即不需要显示黑色边框),所以我的假设是不需要缩放预览。

例如,您的图像是 1920x1080,而您的视图是 800x800,我希望 PreviewView 不会缩放图像,而只是从现有图像的中心裁剪一个 800x800 的正方形(使用 FILL_CENTER)。

但是,在查看代码时,我找不到任何在分辨率较高时实际上阻止缩放发生的条件。

For example:

        preview.setScaleX(surfaceRectInPreviewView.width() / mResolution.getWidth());
        preview.setScaleY(surfaceRectInPreviewView.height() / mResolution.getHeight());
        preview.setTranslationX(surfaceRectInPreviewView.left - preview.getLeft());
        preview.setTranslationY(surfaceRectInPreviewView.top - preview.getTop());

这段代码在all the matrix transformations are done 之后(我不完全理解),所以我可能会误解它。所以我只是想验证我的假设,即如果图像的分辨率高于视图,​​是否会缩放图像。

【问题讨论】:

    标签: android androidx android-camerax


    【解决方案1】:

    PreviewView 旨在显示最大可能的 FOV。如果您希望显示更小的 FOV,可以查看缩放 API:https://developer.android.com/reference/androidx/camera/core/CameraControl#setZoomRatio(float)

    PreviewView 中的缩放是为了消除黑条,以防预览的纵横比与视图的纵横比不匹配。他们有什么决议并不重要。

    在您的示例中,输出图像为 1920x1080,视图为 800x800。对于FILL_* 类型,输出图像将被缩放以填充视图,在这种情况下,它将被缩放到 1422x800,然后将裁剪掉额外的图像。对于FIT_* 类型,输出图像将被缩放以适合视图,在这种情况下,它将被缩放到 800x450,并放置在视图内。

    希望这会有所帮助。如果您还有其他问题,请告诉我。

    【讨论】:

    • 你的第一段正是我想要表达的观点。如果缩放只是为了摆脱黑色边框(黑条),那么为什么需要缩放 1920x1080 图像?它可以被裁剪并显示在视图中,没有任何黑色边框。
    • PreviewView 旨在显示最大可能的 FOV。如果您希望显示更小的 FOV,可以查看缩放 API:developer.android.com/reference/androidx/camera/core/…
    • 好的,您可以将其添加到您的答案中吗?因为这真的是我要问的。我在文档中没有找到任何地方说“PreviewView 旨在显示最大可能的 FOV”,所以这对我来说根本不清楚
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多