Android Java:将Camera2预览图像拉伸

时间:2018-09-27 05:40:11

标签: java android android-camera android-camera2

我目前正在使用camera2 API制作我的android应用。我能够制作图像,保存图像,编辑图像等等。但是我的相机总是拉长的。

我使用的是Samsung Galaxy Tab A和Samsung Galaxy Note 8,而不是16:9的比例。

首先,我只在横向模式下拍照。

我的 textureView 与我的显示器尺寸完全相同。我的预览效果会更好,因为我也使用它的大小来保存图像。而且,如果将其设置为与显示器相同的尺寸,则会得到拉伸图像。

            //getting the ratio, correct setting of sizes
        if (verh == sechzehnzuneun) {
            newSize = new Size(2300, 1350);
        } else if (verh == sechzehnzuzehn) {
            newSize = new Size(2400, 1500);
        } else if (verh == note8) {
            newSize = new Size(2792, 1440);
        }
//also used for saving
        _imageDimension = newSize;

        //used for rotating the preview, otherwise i geht some strange portrait camera 
Matrix matrix = new Matrix();
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        RectF textureRectF = new RectF(0, 0, _textureView.getWidth(), _textureView.getHeight());
        RectF previewRectF = new RectF(0, 0, _imageDimension.getHeight(), _imageDimension.getWidth());
        float centerX = textureRectF.centerX();
        float centerY = textureRectF.centerY();
        if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
            previewRectF.offset(centerX - previewRectF.centerX(),
                    centerY - previewRectF.centerY());
            matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
            float scale = Math.max((float) width / _imageDimension.getWidth(),
                    (float) height / _imageDimension.getHeight());
            matrix.postScale(scale, scale, centerX, centerY);
            matrix.postRotate(90 * (rotation - 2), centerX, centerY);
        } else {
            //neu weg wenn nicht
            previewRectF.offset(centerX - previewRectF.centerX(), centerY - previewRectF.centerY());
            matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
            float scale = Math.max((float)height / _imageDimension.getHeight(), (float)width / _imageDimension.getWidth());
            matrix.postScale(scale, scale,centerX,centerY);
            matrix.postRotate(0, centerX, centerY);
        }
        _textureView.setTransform(matrix);

我得到的是if的高位代码。

但是看(仅纵向看,但方向没有变化,始终是水平的)

But look (only looking in portrait at it, but there is no orientation change, always horizontal):

看风景

Looking in landscape

1 个答案:

答案 0 :(得分:0)

您是否查看过Google的示例camera2应用中的AutoFitTextureView

不能特别保证照相机设备完全支持设备的显示尺寸,如果不支持,则选择接近要求尺寸的尺寸。但这可能不会具有相同的纵横比。

您需要选择相机设备实际支持的尺寸,然后将TextureView设置为匹配的宽高比。