来自相机的预览图像被拉伸
Preview image from the camera is stretched
我有一个 Android 应用程序可以打开相机、开始预览并在屏幕上进行流式传输。重要说明:没有真正的 SurfaceView
与相机关联。只有一个虚拟 SurfaceTexture
:
m_previewTexture = new SurfaceTexture(58346);
camera.setPreviewTexture(m_previewTexture);
现在,我正在使用 Camera.PreviewCallback
获取图像。我进一步用它做什么是无关紧要的。到目前为止我是在屏幕上显示它,但我还不如将它保存在存储卡上。
现在,问题来了。我将预览大小设置为 320x240。我得到 320x240 大小的图像,一切看起来都很好。但是一旦现实生活中的物体进入画面,我就可以清楚地看到图像被拉伸了。
我的 activity 的方向被锁定,不旋转。当我相对于固定物体旋转设备时,我可以非常清楚地看到并确认图像被拉伸了。为什么会这样,如何避免拉伸?
您的屏幕宽高比是否与预览的帧率相对应?
确保 onMeasure 中的正确宽高比:
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
if (this.mAspectRatio == 0) {
super.onMeasure(widthSpec, heightSpec);
return;
}
int previewWidth = MeasureSpec.getSize(widthSpec);
int previewHeight = MeasureSpec.getSize(heightSpec);
int hPadding = getPaddingLeft() + getPaddingRight();
int vPadding = getPaddingTop() + getPaddingBottom();
previewWidth -= hPadding;
previewHeight -= vPadding;
boolean widthLonger = previewWidth > previewHeight;
int longSide = (widthLonger ? previewWidth : previewHeight);
int shortSide = (widthLonger ? previewHeight : previewWidth);
if (longSide > shortSide * mAspectRatio) {
longSide = (int) ((double) shortSide * mAspectRatio);
} else {
shortSide = (int) ((double) longSide / mAspectRatio);
}
if (widthLonger) {
previewWidth = longSide;
previewHeight = shortSide;
} else {
previewWidth = shortSide;
previewHeight = longSide;
}
// Add the padding of the border.
previewWidth += hPadding;
previewHeight += vPadding;
// Ask children to follow the new preview dimension.
super.onMeasure(MeasureSpec.makeMeasureSpec(previewWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(previewHeight, MeasureSpec.EXACTLY));
}
来自 this 项目
我有一个 Android 应用程序可以打开相机、开始预览并在屏幕上进行流式传输。重要说明:没有真正的 SurfaceView
与相机关联。只有一个虚拟 SurfaceTexture
:
m_previewTexture = new SurfaceTexture(58346);
camera.setPreviewTexture(m_previewTexture);
现在,我正在使用 Camera.PreviewCallback
获取图像。我进一步用它做什么是无关紧要的。到目前为止我是在屏幕上显示它,但我还不如将它保存在存储卡上。
现在,问题来了。我将预览大小设置为 320x240。我得到 320x240 大小的图像,一切看起来都很好。但是一旦现实生活中的物体进入画面,我就可以清楚地看到图像被拉伸了。
我的 activity 的方向被锁定,不旋转。当我相对于固定物体旋转设备时,我可以非常清楚地看到并确认图像被拉伸了。为什么会这样,如何避免拉伸?
您的屏幕宽高比是否与预览的帧率相对应? 确保 onMeasure 中的正确宽高比:
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
if (this.mAspectRatio == 0) {
super.onMeasure(widthSpec, heightSpec);
return;
}
int previewWidth = MeasureSpec.getSize(widthSpec);
int previewHeight = MeasureSpec.getSize(heightSpec);
int hPadding = getPaddingLeft() + getPaddingRight();
int vPadding = getPaddingTop() + getPaddingBottom();
previewWidth -= hPadding;
previewHeight -= vPadding;
boolean widthLonger = previewWidth > previewHeight;
int longSide = (widthLonger ? previewWidth : previewHeight);
int shortSide = (widthLonger ? previewHeight : previewWidth);
if (longSide > shortSide * mAspectRatio) {
longSide = (int) ((double) shortSide * mAspectRatio);
} else {
shortSide = (int) ((double) longSide / mAspectRatio);
}
if (widthLonger) {
previewWidth = longSide;
previewHeight = shortSide;
} else {
previewWidth = shortSide;
previewHeight = longSide;
}
// Add the padding of the border.
previewWidth += hPadding;
previewHeight += vPadding;
// Ask children to follow the new preview dimension.
super.onMeasure(MeasureSpec.makeMeasureSpec(previewWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(previewHeight, MeasureSpec.EXACTLY));
}
来自 this 项目