Я использую 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, чтобы оно было больше экрана?