Правильно ли задокументирована Android-камера CameraInfo.orientation? Неправильно реализовано? - PullRequest
24 голосов
/ 29 января 2012

В Android вы можете получить описание свойств Camera, получив CameraInfo.Меня интересует ориентация, как описано в http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation

. Однако документация кажется несовместимой с поведением всех четырех моих устройств, и у меня есть новости о пятом устройстве, для которого это фиксированное значение изменяется.

В частности, в документации сказано:

Значение - это угол, на который необходимо повернуть изображение с камеры по часовой стрелке, чтобы оно правильно отображалось на дисплее в его естественной ориентации.... Например, предположим, что устройство имеет естественно высокий экран.Датчик обратной камеры установлен в ландшафте.Вы смотрите на экран.Если верхняя сторона датчика камеры выровнена с правым краем экрана в естественной ориентации, значение должно быть 90. Если верхняя сторона сенсора камеры, расположенного спереди, выровнена по правой стороне экрана, значение должнобыть 270.

Но в приведенном примере изображение с камеры поворачивается на 90 градусов по часовой стрелке относительно естественной высоты, а не наоборот.То есть изображение, верхняя часть которого выровнена по правой стороне устройства, нуждается в повороте на 270 градусов по часовой стрелке для выравнивания по верхней стороне устройства.

По крайней мере, все четыре моих устройства отображают "90"для этого значения, и все действуют так, как если бы верх камеры находился на правой стороне устройства, когда он находится в естественной ориентации.То есть изображение должно поворачиваться на 270 градусов по часовой стрелке, а не на 90, чтобы соответствовать естественной ориентации.Пример кажется правильным;первая строка - нет.

Этот пример кода , кажется, подтверждает мой вывод, поскольку он дает правильный результат только тогда, когда ориентация интерпретируется, как указано выше.

Странно, у меня естьрегистрируйте данные с устройства одного пользователя, которые показывают, что он сообщает об этом значении как 90 время от времени, так и 0 в другое время!Это должно быть физическое свойство того, как камера установлена ​​в устройстве, верно?

  1. Кто-нибудь может подтвердить, что первая строка документации на самом деле неверна, а пример верен?
  2. Кто-нибудь наблюдал изменение значения CameraInfo.orientation?Есть ли в документации доказательства того, что это законное поведение, или это, скорее всего, ошибка в устройстве?
  3. Любые другие комментарии, опыт, ошибки, с которыми я еще не сталкивался?

Ответы [ 3 ]

11 голосов
/ 06 февраля 2012

1) Может ли кто-нибудь подтвердить, что первая строка документации на самом деле неверно, а пример верный?

Вы уже рассмотрели этот вопрос уже в своем ответе , спасибо за объяснение!

2) Кто-нибудь наблюдал изменение значения CameraInfo.orientation? Есть ли в документах доказательства того, что это законное поведение или ошибка в устройстве?

Хотя я могу легко представить, что это принципиальная ошибка, она все равно будет довольно серьезной, затрагивающей все виды приложений, связанных с изображениями, например, из-за того, что полученная информация будет встроена в фотографии с помощью EXIF ​​(другие EXIF) связанные с ним ошибки на некоторое время ).

Таким образом, я бы посчитал, что это, скорее всего, актуальная особенность одного из этих тысяч устройств Android, то есть камеры с возможностью физического вращения объектива. Хотя в настоящее время я не знаю ни одного устройства на базе Android, раньше были доступны такие телефоны, например LG VX7000 (~ 2004 г.) или Samsung SCH-a930 (~ 2006 г.) (см., например, Вращающийся объектив камеры в руководстве ), поэтому я бы не удивляйтесь, если что-то подобное появится и в сфере Android.

Кстати, есть неотвеченный вопрос Почему мои фотографии перевернуты или перевернуты. в пределах Вопросы и ответы для клиентов Samsung SCH-A930 относительно последнего:

В последнее время мои фото были вверх ногами или задом наперед. Почему это происходит и как я могу это исправить.

На самом деле это может быть ошибкой в ​​неработающем оборудовании / программном обеспечении регулировки вращения;)

Итак, в заключение, я думаю, что лучше подготовиться к тому, чтобы ориентация смогла измениться, пока у вас не будет более четких доказательств того, что это действительно глючное устройство.

11 голосов
/ 01 февраля 2012

Полагаю, я ответил здесь на свой вопрос после еще нескольких размышлений.

Пример правильный. И текст правильный на самом деле. В данном примере, если данные предварительного просмотра отображаются на экране, они будут отображаться повернутыми на 90 градусов против по часовой стрелке, поскольку «вверх» в данных находится справа от дисплея и отображается на дисплей, чье «вверх» находится, так сказать, слева от данных. Поэтому необходимо выполнить компенсацию, повернув данные изображения на 90 градусов по часовой стрелке перед отображением.

Я думаю, что более естественно понимать эту цифру как поворот, при котором камера установлена ​​относительно естественной ориентации.

По этим и другим причинам я пришел к выводу, что устройство, которое показывает изменяющееся значение для ориентации, просто глючит. По крайней мере, когда он сообщает 0, его данные действуют как «90» - правильное значение.

0 голосов
/ 07 августа 2016

Еще один способ решения этой проблемы - расширение OrientationEventListener. и переопределив метод onOrientationChanged, вы получите ориентацию вашего телефона даже при отключенном автоматическом повороте (поскольку слушатель отправляет событие поворота через датчик).

Вы должны включить и отключить прослушиватель ориентации при onResume / onPause, чтобы предотвратить разрядку аккумулятора.

    private class OnOrientationChange extends OrientationEventListener {
    private boolean isEnabled = false;

    public OnOrientationChange(Context context) {
        super(context);
        disable();
    }

    @Override
    public void onOrientationChanged(int orientation) {
        if (camera != null && orientation != ORIENTATION_UNKNOWN) {
            int newOutputOrientation = getCameraPictureRotation(orientation);

            if (newOutputOrientation != outputOrientation) {
                outputOrientation = newOutputOrientation;

                Camera.Parameters params = camera.getParameters();

                params.setRotation(outputOrientation);

                try {
                    camera.setParameters(params);
                    lastPictureOrientation = outputOrientation;
                } catch (Exception e) {
                    Log.e(getClass().getSimpleName(),
                            "Exception updating camera parameters in orientation change",
                            e);
                    // TODO: get this info out to hosting app
                }
            }
        }
    }

    @Override
    public void enable() {
        isEnabled = true;
        super.enable();
    }

    @Override
    public void disable() {
        isEnabled = false;
        super.disable();
    }

    boolean isEnabled() {
        return (isEnabled);
    }
}

спасибо за общее программное обеспечение для решения

...