Предварительный просмотр положения CWAC-CAMERA поверх доступной области предварительного просмотра, когда useFullBleedPreview = false

Я пытаюсь использовать CameraFragment из cwac-v9-camera для создания пользовательского фрагмента камеры, снимающего и предварительного просмотра квадратных изображений.

Я хочу, чтобы предварительный просмотр и сделанное изображение были полностью идентичными, поэтому: 1. Я использую FullBleedPreview = false 2. Я хочу, чтобы изображение для предварительного просмотра имело полную ширину, и мне нужно разместить изображение для предварительного просмотра в самом верху области предварительного просмотра, чтобы я мог закрыть остальное изображения с некоторым представлением, чтобы сделать его квадратным.

Проблема в том, что CameraView рисует изображение в центре области предварительного просмотра камеры и добавляет белые линии сверху и снизу.

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


person Viktar Patotski    schedule 03.06.2014    source источник


Ответы (2)


У меня та же проблема, и я потратил день на эту библиотеку CWAC (кстати, она просто великолепна). Я хотел бы поделиться своим исследованием и, надеюсь, вы (и я) скоро получите рабочее решение.

Тестовая платформа: Sony Xperia Z, Android 4.2.2

Тестовое разрешение: 1080 x 1920.

Доступный предварительный просмотр: 1280 x 720, 960 x 720, 720 x 480, 704 x 576, 640 x 480, 480 x 320, 320 x 240, 176 x 144.

Целевой размер предварительного просмотра: 1080x1080, квадрат, конечно :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. макет.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.
person John Pang    schedule 27.10.2014

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

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

person CommonsWare    schedule 03.06.2014
comment
Спасибо за ваш ответ. Но проблема в том, что он рисует этот превью в центре CameraView. И вопрос: можно ли его отрисовать начиная с верхней части CameraView? - person Viktar Patotski; 04.06.2014
comment
Значит ли это, что на телефонах, где отсутствует автофокус, проблема не решается? - person Viktar Patotski; 27.06.2014
comment
@xp-vit: ваш комментарий не имеет смысла в контексте этого вопроса. - person CommonsWare; 27.06.2014