Camera2全屏预览和图像捕捉
Posted
技术标签:
【中文标题】Camera2全屏预览和图像捕捉【英文标题】:Camera2 full screen preview and image capture 【发布时间】:2017-06-18 13:30:30 【问题描述】:我正在为 Camera2 使用 sample code,我想知道如何使预览和捕获的图像全屏显示? This SO question 似乎在视频模式下解决了它,但我找不到任何图像捕获的解决方案。示例片段底部有一个蓝色区域,并且还有状态栏。我想隐藏这两个并使用整个屏幕显示预览,并以全屏大小捕获图像。
【问题讨论】:
【参考方案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 纵横比的图像”的问题,您能否将其添加到您的答案中或将链接添加到答案中?我一直在谷歌搜索,但到目前为止没有运气...... 我不确定你在问什么——你的意思是链接到其他一些 *** 问题吗?如果你想捕捉 16:9 的 JPEG,你需要为你用来捕捉它们的 ImageReader 选择一个 16:9 的分辨率。 这是我接下来要尝试的:***.com/questions/26583489/… 好的,谢谢您的回复。我也会试试的!以上是关于Camera2全屏预览和图像捕捉的主要内容,如果未能解决你的问题,请参考以下文章
Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度
使用 Android L 和 Camera2 API 处理相机预览图像数据