Предварительный просмотр положения CWAC-CAMERA поверх доступной области предварительного просмотра, когда useFullBleedPreview = false
Я пытаюсь использовать CameraFragment из cwac-v9-camera для создания пользовательского фрагмента камеры с предварительным просмотром изображений Square.
Я хочу, чтобы предварительный просмотр и сделанный снимок были полностью идентичны, поэтому: 1. Я использую FullBleedPreview = false 2. Я хочу, чтобы предварительный просмотр занимал полную ширину, и мне нужно поместить мое предварительное изображение в самый верх области предварительного просмотра, чтобы я мог покрыть остальные изображения с некоторым видом, чтобы сделать его квадратным.
Проблема в том, что CameraView рисует изображение в центре области предварительного просмотра камеры и добавляет белые линии сверху и снизу.
Есть ли способ контролировать, где lobrary рисует изображение для предварительного просмотра?
2 ответа
У меня та же проблема, и я провел день в этой библиотеке CWAC (кстати, она великолепна). Я хотел бы поделиться своими исследованиями и, надеюсь, вы (и я) скоро получите рабочее решение.
Тестовая платформа: Sony Xperia Z, Android 4.2.2
Разрешение теста: 1080x1920.
Доступен предварительный просмотр: 1280x720, 960x720, 720x480, 704x576, 640x480, 480x320, 320x240, 176x144.
Target Preview размер: 1080х1080, квадрат, конечно:D
Тест сделан внутри CameraHost.getPreviewSize() моего пользовательского CameraHost.
Если я предоставлю квадратный вид / размер функции суперкласса, я получу 704x576. Это 11:9 (или 1.22222~), что ближе всего к 1: 1 или 1.0. Тем не менее, он выглядит размытым при увеличении до 1080 ширины и также искажается.
1280x720 - это 16:9 (1.777~). Камера устройства получила это, обрезав верх и низ (обратите внимание, что камера разговаривает в ландшафтном режиме).
960x720 - это 4:3 (1,333). Это полное разрешение камеры устройства. Это мое целевое разрешение, где я хочу только 720x720 внутри 960x720 по направлению к верхнему краю (портрет) или левому краю (пейзаж).
В своем пользовательском CameraHost (расширяет SimpleCameraHost) ограничьте размер предварительного просмотра:
@Override public Size getPreviewSize(int orientation, int w, int h, Parameters p) { Size size = super.getPreviewSize(orientation, 720, 960, p); ViewGroup.LayoutParams params = cameraView.getLayoutParams(); params.width = 1080; params.height = 960 * 1080/720; cameraView.setLayoutParams(params); return size; }
layout.xml:
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.commonsware.cwac.camera.CameraView android:id="@+id/cameraView" android:layout_width="match_parent" android:layout_gravity="top|center_horizontal" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.example.android.widget.SquareView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical" android:background="#99e0e0e0"> (your elements to cover up the extra area) </LinearLayout> </LinearLayout> </FrameLayout>
Ниже приведен результат и сравнение с системной камерой, используя 4:3.
Замечания:
- Я полагаю, вы знаете, как создать свой собственный SquareView, поэтому я не буду публиковать его код здесь. Вы можете прочитать больше здесь: Простой способ сделать динамическое, но квадратное расположение
- Кусок кода в #4 является просто тестовым кодом - вам нужно выяснить, как его можно адаптировать для всех устройств.
- НЕ принимайте событие щелчка CameraView для фокусировки. Вместо этого используйте SquareView.
Есть ли способ контролировать, где lobrary рисует изображение для предварительного просмотра?
Рисует изображение где CameraView
является. Где именно в этом пространстве оно находится, зависит от соотношения сторон CameraView
и соотношение сторон изображения предварительного просмотра и не может быть определено заранее.