Android Java: изображение предварительного просмотра Camera2 растянуто - PullRequest
0 голосов
/ 27 сентября 2018

В настоящее время я делаю свое приложение для Android с Camera2 API.Я умею делать изображения, сохранять их, редактировать их и так далее.Но моя камера всегда растянута.

Я использую 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);

Я получаю регистр букв верхнего регистра.

Но посмотрите (смотрите только на портрете вэто, но нет изменения ориентации, всегда в горизонтальном положении)

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

Глядя в ландшафт

Looking in landscape

1 Ответ

0 голосов
/ 27 сентября 2018

Вы смотрели на AutoFitTextureView в примерах приложений camera2 от Google?

Нет особой гарантии, что устройство камеры поддерживает точно размер экрана устройства, и если это не так't, выбран размер, близкий к запрашиваемому размеру.Но это, скорее всего, не будет иметь такое же соотношение сторон.

Вам нужно выбрать размер, который фактически поддерживает устройство камеры, а затем установить в TextureView подходящее соотношение сторон.

...