Как заполнить SurfaceView нестандартного размера предварительным просмотром обрезанной камеры с помощью Camera2? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую SurfaceView для показа канала с камеры с помощью API-интерфейса Camera2 - он работает, но независимо от того, что я делаю, изображение кажется растянутое или увеличенное в очень заметной степени.

Я попытался использовать размер кадра SurfaceView и просто сделать изображение больше экрана с отрицательными границами (, как это ), но это растягивало изображение. Сейчас я пытаюсь использовать SCALER_CROP_REGION , но кажется, что это увеличение масштаба примерно до 2: 1, когда фактический SurfaceView примерно на 90 пикселей меньше, чем разрешение изображения. Часть моего кода, конфигурирующего вещи, выглядит в основном так, за исключением того, что реальный код - это скорее разбросанное, пронизанное экспериментом крушение:

    int width = mTextureView.getWidth();
    int height = mTextureView.getHeight();
    CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(cameraId);
    StreamConfigurationMap map = characteristics.get(
                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    Size mCameraSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class));
    int xOffset = Math.floor((mCameraSize.x - width) / 2);
    int yOffset = Math.floor((mCameraSize.y - height) / 2);
    Rect cropRectangle = new Rect(xOffset, yOffset, width, height);
    mCaptureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRectangle );

Важно то, что изображение отображается на SurfaceView, но оно увеличивается. Так, например:

  • Размеры камеры, оптимально подходящей для моего телефона в портретном режиме, составляют 720 x 1280.
  • Размер SurfaceView - 720 x 1184.
  • cropRectangle начинается с 0, 48 и имеет размеры 720 x 1184.

То, что я ожидал бы увидеть, это верх и низ изображения немного обрезанные, но ширина не изменилась. Вместо этого я вижу, что изображение увеличено, так что, по предположению, я получаю примерно 50% среднего изображения, увеличенного для заполнения экрана. Насколько я могу сказать, он также немного растянут по вертикали? Когда я делаю снимок из этого предварительного просмотра, он показывает нормальный размер и проясняет, насколько увеличенным было предварительное изображение.

Что я делаю не так с моим обрезанием, чтобы вызвать эту проблему? Мне лучше вернуться к предыдущему подходу расширения SurfaceView, чтобы оно было больше экрана?

1 Ответ

0 голосов
/ 14 ноября 2018

К сожалению, SCALER_CROP_REGION не может помочь вам компенсировать искажение.Это определяет область датчика, которая будет считываться для захвата, но результат не идет прямо на экран, он передается в выходной поток.

Выходные потоки используют этот прямоугольник, чтобы произвести их выводобрезка в меньшую область, если необходимо, чтобы сохранить соотношение сторон потока, затем масштабирование входа датчика в соответствии с настроенным разрешением выхода.

См. этот ответ для примера обработкиискажение по-разному.

...