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

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

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

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

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

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

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

1 Ответ

1 голос
/ 12 января 2012

Я пытаюсь понять это сам.Вот что я узнал до сих пор ...

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

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

...