Как Android обрабатывает различия между размером / соотношением предварительного просмотра и фактическим размером SufaceView?

Я пишу небольшое приложение для Android, в котором пользователь может поместить изображение в предварительный просмотр камеры в реальном времени и сфотографировать его. Затем приложение соответствующим образом объединит два изображения - все это работает нормально.

Я понимаю, что вы можете получить / установить PreviewSize с помощью Camera.getParameters (), я предполагаю, что это связано с размером "канала камеры" в реальном времени.

Однако размер моего SurfaceView, на котором отображается предварительный просмотр камеры, отличается от заявленных (и используемых) PreviewSizes. Например, в эмуляторе мой доступный SurfaceView имеет размер 360x215, а PreviewSize - 320x240. Тем не менее, весь SurfaceView заполнен предварительным просмотром.

Но картинка, которая получается в итоге, имеет (тоже?) 320x240. Как Android компенсирует эти различия в размере и соотношении сторон? Изображение обрезано?

Или я просто неправильно понимаю, что такое PreviewSize - связано ли это с размером сгенерированных изображений или с «предварительным просмотром в реальном времени», проецируемым на SurfaceView? Есть ли какие-нибудь нетривиальные примеры камер, которые решают эту проблему?

Мне нужно знать, как происходит преобразование, чтобы в конечном итоге правильно скопировать / масштабировать изображение на фотографию, отсюда и эти вопросы.


person Ivo van der Wijk    schedule 09.01.2012    source источник
comment
Вы можете взглянуть на мой ответ себе на аналогичный вопрос: stackoverflow.com/a/18159351/994834   -  person goto10    schedule 11.08.2013


Ответы (1)


Я сам пытаюсь в этом разобраться. Вот что я выяснил на данный момент ..

  • Вид поверхности имеет внутреннюю поверхность, называемую mSurface, которая фактически используется как канал камеры и канал энкодера. Таким образом, этот буфер должен иметь фактический размер, в котором вы хотите делать запись.
  • Вы можете установить размер этого mSurface, чтобы он не зависел от SurfaceView, используя метод setFixedSize
  • Теперь вы можете захотеть выполнить запись HD, поэтому mSurface должно иметь разрешение 1280x760, но ваше SurfaceView не может быть таким большим (при условии, что вы запускаете его на телефоне с экраном WVGA). Поэтому вы пытаетесь установить меньшее разрешение, чем 1280x760, которое также поддерживает такое же соотношение сторон.
  • Android теперь выполняет изменение размера буфера HD, чтобы получить разрешение предварительного просмотра, кадрирование не выполняется, его размер просто изменяется до SurfaceView повторных вставок.
  • Таким образом, на этом этапе и mSurface, и previewSize, которые вы установили для камеры, имеют одинаковое разрешение, и, следовательно, результирующая видеозапись также будет иметь одинаковое разрешение.

При этом я все еще изо всех сил пытаюсь заставить мой VGA-рекордер работать на Nexus S, он работает на устройстве LG Maha. :)

person bluefalcon    schedule 12.01.2012