Camera2全屏预览和图像捕获

4

我正在使用Camera2的示例代码,想知道如何将预览和捕获的图像全屏显示?这个 SO 问题似乎解决了视频模式下的问题,但我找不到任何关于图像捕获方面的解决方案。示例片段底部有一个蓝色区域并且还有状态栏。我想隐藏它们,并使用整个屏幕来显示预览,同时在全屏大小中捕获图像。

2个回答

7

Eddy关于宽高比的说法是正确的。相机传感器的宽高比为4:3,屏幕通常为16:9。示例代码选择显示整个相机预览,因此部分屏幕未被填充。您需要拉伸以填满整个屏幕,但在这种情况下,捕获的图像包括预览中未显示的区域。

要在全屏中查看,请在AutoFitTextureView中将onMeasure方法更改为以下内容:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        if (0 == mRatioWidth || 0 == mRatioHeight) {
            setMeasuredDimension(width, height);
        } else {
            if (width < height * mRatioWidth / mRatioHeight) {
                // setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
                setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
            } else {
                //setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
                setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
            }
        }
    }

更新: 正如Eddy所指出的那样,这将在全屏幕上显示相机预览的左上部分,留下底部和右侧看不到,结果造成图像不居中。 在我的特定情况下,主题需要水平居中,因此我修改了变换矩阵以使主题水平居中。这是代码:
// adjust the x shift because we are not showing the whole camera sensor on the screen, need to center the capture area
    int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
    Log.d(TAG, "screen width " + screenWidth);
    int xShift = (viewWidth - screenWidth)/2;
    matrix.setTranslate(-xShift, 0);

        mTextureView.setTransform(matrix);

2
作为一条注释,这很可能不会将预览居中显示在屏幕上 - 它会在右侧和底部被裁剪(尽管我需要检查包含父级在这种情况下如何扩展)。这可能对您有所影响,也可能没有。 - Eddy Talvala
@EddyTalvala 你说得对。我修改了变换矩阵以使预览居中。已更新帖子中的示例代码。 - Ray
翻译帮了大忙!谢谢你! - prex

2
请注意,相机传感器的宽高比和设备屏幕的宽高比通常不匹配 - 传感器通常是4:3,而屏幕通常是16:9左右。但两者都有很大的变化。
由于宽高比不匹配,您需要决定是否使用黑边,或将相机预览缩放以填满屏幕(但图像的某些部分不可见)。
在任何情况下,要使预览全屏,只需让TextureView(或SurfaceView)占据整个布局即可。因此,基本上是编辑此布局文件:fragment_camera2_basic.xml,删除所有其他视图,并在源代码中删除对它们的引用。或将它们更改为位于TextureView之上而不是旁边的位置 - 这是标准的Android UI布局内容。您还需要使Activity成为全屏
默认情况下,AutoFillTextureView将尝试维护宽高比,因此会生成黑色的边框。如果您不想要黑边,则必须更改AutoFillTextureView,这并不简单,我不会在此详细介绍。

Eddy,如果你知道如何解决“以16:9宽高比捕获图像”的问题,你能否将其添加到你的答案中或者提供一个链接?我已经在谷歌上搜索了,但是迄今为止没有找到... - Aaron Lelevier
我不确定你在问什么 - 你是想链接到其他的StackOverflow问题吗?如果你想捕获16:9的JPEG图像,你需要为你用来捕获它们的ImageReader选择一个16:9的分辨率。 - Eddy Talvala
这是我接下来要尝试的:https://dev59.com/-4Tba4cB1Zd3GeqP8p-0 好的,谢谢你的回复。我也会尝试一下! - Aaron Lelevier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接