我想在
TextureView
中显示来自相机的图像。到目前为止,图像已显示,但它的比例和方向不正确。
对于比例,我使用以下代码将预览尺寸调整为图像尺寸。
@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);
} else {
setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
}
}
}
不幸的是,显示的图像比例不正确。与垂直轴相比,水平轴上的比例更大。
对于旋转,我使用 Camera Preview Android Dev 中给出的公式计算方向。然后在创建新的
CaptureRequest.CaptureRequest.JPEG_ORIENTATION
之前使用CaptureRequest
将结果发送到相机。
在纵向模式下,一切都很好,但在横向模式下,图像旋转了 +/- 90°。而在反肖像中,它被翻转了!
有谁知道问题的根源以及我该如何解决?
要解决缩放问题,您可以尝试将 TextureView 的纵横比设置为与相机预览尺寸的纵横比匹配。您可以通过根据相机预览大小的纵横比设置 TextureView 的宽度和高度来完成此操作。你可以这样做:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (mPreviewSize != null) {
int previewWidth = mPreviewSize.getWidth();
int previewHeight = mPreviewSize.getHeight();
if (width > height) {
// Landscape
int tmp = previewWidth;
previewWidth = previewHeight;
previewHeight = tmp;
}
if (height < previewHeight * width / previewWidth) {
width = height * previewWidth / previewHeight;
} else {
height = width * previewHeight / previewWidth;
}
}
setMeasuredDimension(width, height);
}
关于旋转问题,您可以尝试旋转 TextureView 而不是旋转图像。您可以通过根据设备方向设置 TextureView 的旋转来做到这一点。像这样的东西:
int displayRotation = getWindowManager().getDefaultDisplay().getRotation();
int textureViewRotation = 0;
switch (displayRotation) {
case Surface.ROTATION_0:
textureViewRotation = 90;
break;
case Surface.ROTATION_90:
textureViewRotation = 0;
break;
case Surface.ROTATION_180:
textureViewRotation = 270;
break;
case Surface.ROTATION_270:
textureViewRotation = 180;
break;
}
textureView.setRotation(textureViewRotation);
确保在 TextureView 附加到相机预览会话后应用这些更改。