【问题标题】:Camera2 full screen preview and image captureCamera2全屏预览和图像捕捉
【发布时间】:2017-06-18 13:30:30
【问题描述】:

我正在为 Camera2 使用 sample code,我想知道如何使预览和捕获的图像全屏显示? This SO question 似乎在视频模式下解决了它,但我找不到任何图像捕获的解决方案。示例片段底部有一个蓝色区域,并且还有状态栏。我想隐藏这两个并使用整个屏幕显示预览,并以全屏大小捕获图像。

【问题讨论】:

    标签: android camera


    【解决方案1】:

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

    【讨论】:

    • 请注意,这很可能不会使预览在屏幕上居中 - 它会在右侧和底部被切断(尽管在这种情况下我必须准确检查包含父级的扩展方式)。这对您可能很重要,也可能无关紧要。
    • @EddyTalvala 你是对的。我修改了变换矩阵以使预览居中。更新了帖子中的示例代码。
    • 翻译有帮助!谢谢!
    【解决方案2】:

    请注意,摄像头传感器的纵横比与设备屏幕的纵横比通常不匹配 - 传感器的比例通常为 4:3,屏幕的比例通常约为 16:9。尽管两者之间存在很大差异。

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

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

    默认情况下,AutoFillTextureView 会尝试保持纵横比,因此会产生黑条。如果你想要没有黑条,那你就得改一下 AutoFillTextureView,这并不简单,这里就不赘述了。

    【讨论】:

    • Eddy,如果您知道如何解决“捕获具有 16:9 纵横比的图像”的问题,您能否将其添加到您的答案中或将链接添加到答案中?我一直在谷歌搜索,但到目前为止没有运气......
    • 我不确定你在问什么——你的意思是链接到其他一些 StackOverflow 问题吗?如果你想捕捉 16:9 的 JPEG,你需要为你用来捕捉它们的 ImageReader 选择一个 16:9 的分辨率。
    • 这是我接下来要尝试的:stackoverflow.com/questions/26583489/… 好的,谢谢您的回复。我也会试试的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2012-10-19
    • 2017-09-09
    • 2011-03-23
    相关资源
    最近更新 更多