Камера андроида растянута в ландшафтном режиме
Приложение, которое я пишу, требует функциональности камеры.
Поэтому, чтобы узнать, как управлять камерой, я последовал за этим script:
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html
Я поместил активность в свой манифест, установил ориентацию экрана для него в альбомном режиме.
Проблема, с которой я сталкиваюсь, заключается в том, что когда камера держится сбоку (поэтому я держу свою Galaxy Tab P1000 в ландшафтном положении), вид растянут.
Чтобы быть более конкретным о моем script, я использовал точную копию кода, который сделал Google. Его можно найти в файле android-sdk\samples\android-8\ApiDemos\src\com\example\android\apis\graphics\
Сам файл называется CameraPreview.
Я действительно не понимаю, почему экран выглядит так растянуто. Конечно, формат странный, а не квадратный, но при использовании стандартного приложения камеры, установленного на устройстве, он вообще не деформируется. Эта камера деформирует изображение, когда я держу его сбоку и немного передвигаю камеру.
![enter image description here]()
![enter image description here]()
Что я сделал: я держал вкладку галактики, чтобы сделать снимок объекта (ноутбук в этом случае), затем сделал снимок с моим телефоном моей Галактики. В Galaxy у меня есть экран камеры, открытый в приложении, которое я делаю. Это считается для обоих изображений. Один я держу боком и один держись в портретном взгляде. Фотографии немного неясны, но вы можете видеть, что в пейзажной картине камера стала широко широкой.
Ответы
Ответ 1
Я столкнулся с той же проблемой вчера. После исследования источников "Camera" я нашел причину растяжения предварительного просмотра камеры.
Причина в том, что соотношение сторон SurfaceView (ширина/высота) ДОЛЖНО быть таким же, как соотношение сторон Camera.Size, используемое в параметрах предварительного просмотра. И если соотношение сторон не одно и то же, у вас растянутое изображение.
Итак, самым быстрым решением является установка SurfaceView размером 320px x 240px - наименьший поддерживаемый размер из Parameters.getSupportedPreviewSizes().
Кроме того, вы можете посмотреть стандартные источники приложения Camera, он использует настраиваемый макет для управления размером SurfaceView (см. функцию PreviewFrameLayout.java, onMeasure()).
Использование
git clone https://android.googlesource.com/platform/packages/apps/Camera.git
чтобы получить источники камеры.
Ответ 2
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
camera = Camera.open();
camera.setDisplayOrientation(90);
camera.setPreviewDisplay(holder);
Camera.Parameters parameters = camera.getParameters();
List<Size> sizes = parameters.getSupportedPictureSizes();
parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0
parameters.set("orientation","portrait");
//parameters.setPreviewSize(viewWidth, viewHeight);
List<Size> size = parameters.getSupportedPreviewSizes();
parameters.setPreviewSize(size.get(0).width, size.get(0).height);
camera.setParameters(parameters);
camera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Вам нужно только getSupportedPreviewSizes()
и сохранить его в List
:
List<Size> size = parameters.getSupportedPreviewSizes();
parameters.setPreviewSize(size.get(0).width, size.get(0).height);
camera.setParameters(parameters);
camera.startPreview();
Надеюсь, это поможет вам.