Camera2 预览中的图像方向

问题描述 投票:0回答:1

我想在

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°。而在反肖像中,它被翻转了!

有谁知道问题的根源以及我该如何解决?

java android android-camera2
1个回答
0
投票

要解决缩放问题,您可以尝试将 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 附加到相机预览会话后应用这些更改。

© www.soinside.com 2019 - 2024. All rights reserved.