Fotoapparat: Почему пейзаж CameraView захватывает в портретном режиме? - PullRequest
0 голосов
/ 04 ноября 2018

Я добавил библиотеку Fotoapparat в свое приложение. Чтобы управлять всем приложением одной рукой, я пытаюсь сделать CameraView в портретном режиме родителями ConstraintLayout. Как вы можете видеть на следующем снимке экрана, само CameraView является альбомным, но родительский ConstraintLayout всего фрагмента - портретный режим, так что пользователь может управлять приложением одной рукой: Удержание одной рукой для захвата ландшафта Как вы можете видеть, CameraView смоделирован в Lanscape, конечно, это будет означать потерю качества.

Затем я снимаю изображение и показываю захваченное изображение в следующем фрагменте. Как вы можете видеть, захваченное изображение теперь в портретном режиме: Захваченные изображения показаны в портрете

Как видите, я снял пластиковую крышку смартфона также в альбомной ориентации. Левый и правый углы подходят очень хорошо. Но верхняя и нижняя части изображений имеют определенно больше пикселей, чем показано в предварительном просмотре в предыдущем фрагменте.

Я создаю объект Fotoapparart, например:

fotoapparat = Fotoapparat
                .with(activity)
                .into(cameraView)
                .focusView(focusView)
                .sensorSensitivity(highestSensorSensitivity())
                .focusMode(firstAvailable(
                        FocusModeSelectorsKt.continuousFocusPicture(),
                        FocusModeSelectorsKt.autoFocus()))
                .lensPosition(back())
                .build();

мой макет похож на:

<io.fotoapparat.view.CameraView
    android:id="@+id/myapp_camera_view"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="@dimen/myapp_border_margin"
    android:layout_marginEnd="@dimen/myapp_border_margin"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintDimensionRatio="1.778"
    app:layout_constraintBottom_toTopOf="@+id/myapp_border"
    app:layout_constraintTop_toBottomOf="@id/myapp_holder"
    app:layout_constraintVertical_bias="0.5">

    <io.fotoapparat.view.FocusView
        android:id="@+id/myapp_focus_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />

</io.fotoapparat.view.CameraView>

и вот у меня есть функция takePhoto:

void takePicture(final boolean fotoapparatIsStopped) {
    if (!fotoapparatIsStopped) {
        PhotoResult photoResult = fotoapparat.takePicture();

        photoResult.toBitmap()
        .whenDone(new WhenDoneListener<BitmapPhoto>() {
            @Override
            public void whenDone(@Nullable BitmapPhoto photo) {
                this.bitmapPhoto = photo;
            }
        });
    }
}

Версии: Фотоаппарат 2.4.0 Java SDK 8 Android Studio 3.2

Что я не так делаю?

или другими словами:

Как я могу запечатлеть пейзаж, удерживая камеру / портрет смартфона?

1 Ответ

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

Я думаю, что Фотоаппарат не предоставляет эту функциональность из коробки. Возможно, вам придется сделать это вручную, вращая само растровое изображение:

// rotate Bitmap by means of rotation matrix    
public void whenDone(@Nullable BitmapPhoto photo) {
    Matrix rotationMatrix = new Matrix();
    rotationMatrix.postRotate(phi); // int phi is the angle, here 90

    Bitmap landscapeBitmap = Bitmap.createBitmap(photo.bitmap, 0, 0, photo.bitmap.getHeight(), photo.bitmap.getWidth(), rotationMatrix, true);
    this.bitmapPhoto = new BitmapPhoto(landscapeBitmap, 0);
}
...