Camera2全屏预览和图像捕捉

时间:2017-02-01 17:26:57

标签: android camera

我正在使用sample code用于Camera2,我想知道如何在全屏下进行预览和拍摄图像? This所以问题似乎在视频模式下解决了,但我无法找到任何图像捕获解决方案。样本片段底部有一个蓝色区域,并且状态为bas。我想隐藏这两个并使用整个屏幕来显示预览,并以全屏大小捕获图像。

2 个答案:

答案 0 :(得分:2)

请注意,相机传感器的纵横比和设备屏幕的纵横比通常不匹配 - 传感器通常为4:3比例,屏幕通常约为16:9。虽然两者都有很大差异。

由于纵横比不匹配,您需要决定是否要使用黑条,或缩放相机预览以使其填满屏幕(但图像的某些部分不可见)

在任何情况下,要使预览为全屏,您只需要将TextureView(或SurfaceView)作为整个布局。基本上,编辑此布局文件:fragment_camera2_basic.xml,删除所有其他视图,并在源代码中删除对它们的引用。或者将它们更改为在TextureView之上,而不是在旁边 - 这是所有标准的Android UI布局。您需要将活动设为full-screen

默认情况下,AutoFillTextureView会尝试保持宽高比,因此会产生黑条。如果你不想要黑条,那么你将不得不改变AutoFillTextureView,这不是直截了当的,我不会在这里进入。

答案 1 :(得分:2)

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);