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