Предварительный просмотр положения 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.

  1. Если я предоставлю квадратный вид / размер функции суперкласса, я получу 704x576. Это 11:9 (или 1.22222~), что ближе всего к 1: 1 или 1.0. Тем не менее, он выглядит размытым при увеличении до 1080 ширины и также искажается.

  2. 1280x720 - это 16:9 (1.777~). Камера устройства получила это, обрезав верх и низ (обратите внимание, что камера разговаривает в ландшафтном режиме).

  3. 960x720 - это 4:3 (1,333). Это полное разрешение камеры устройства. Это мое целевое разрешение, где я хочу только 720x720 внутри 960x720 по направлению к верхнему краю (портрет) или левому краю (пейзаж).

  4. В своем пользовательском 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;
    }
    
  5. 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.

Экран с использованием этого кодаПриложение камеры по умолчанию с 4: 3

Замечания:

  1. Я полагаю, вы знаете, как создать свой собственный SquareView, поэтому я не буду публиковать его код здесь. Вы можете прочитать больше здесь: Простой способ сделать динамическое, но квадратное расположение
  2. Кусок кода в #4 является просто тестовым кодом - вам нужно выяснить, как его можно адаптировать для всех устройств.
  3. НЕ принимайте событие щелчка CameraView для фокусировки. Вместо этого используйте SquareView.

Есть ли способ контролировать, где lobrary рисует изображение для предварительного просмотра?

Рисует изображение где CameraView является. Где именно в этом пространстве оно находится, зависит от соотношения сторон CameraView и соотношение сторон изображения предварительного просмотра и не может быть определено заранее.

Другие вопросы по тегам