Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La visualización / visualización de la cámara en pantalla completa no mantiene la relación de aspecto: la imagen está sesgada, estirada para encajar en la pantalla

He desarrollado una pequeña aplicación para mostrar la vista previa de la cámara en pantalla completa. Estoy usando Camera API para esto.

Este es el diseño de la actividad:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- This is the container for the camera preview screen --> <FrameLayout android:id="@+id/camera_preview" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> 

Cuando el dispositivo está en posición vertical, la pantalla se escala verticalmente para coincidir con la altura de la pantalla del dispositivo, de modo que la relación de aspecto no sea la misma que la de la cámara nativa. Estas son 2 imágenes que explica mejor lo que estoy diciendo:

Introduzca aquí la descripción de la imagenIntroduzca aquí la descripción de la imagen

La primera imagen se hace con el dispositivo nativo de la cámara. La segunda imagen se hace con mi aplicación, con cámara en pantalla completa – la imagen está sesgada, estirada para encajar en la pantalla.

Necesito que la vista previa de la cámara sea a pantalla completa, independientemente del tamaño de vista previa dado por getSupportedPreviewSizes() mehod y sin distorsión. ¿Hay alguna manera de lograr esto? ¿Hay una manera de mantener la relación de aspecto adecuada cuando la vista previa de la cámara está en pantalla completa? Esperaba que esto se hiciera automáticamente por OS – recortar la imagen para que coincida con la resolución solicitada, manteniendo la relación de aspecto, pero esto no sucede.

He intentado hacer que el SurfaceView más grande que la pantalla (siguiendo esta pregunta: montar una vista previa de cámara a un SurfaceView más grande que la pantalla ), pero no está bien en mi caso ya que estoy capturar instantáneas (6 cuadros / segundo) y Éstos no son lo que el usuario ve en la pantalla (el marco contiene toda la vista previa de la cámara aunque no todo sea visible en la pantalla).

He publicado aquí: https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v=0mcn todo el proyecto que he realizado.

Cualquier idea / solución es más que importante para mí. Muchas gracias.

============================================================================== ===========================================

Actualización debido a ss1271 respuesta:

Analizaré un poco las resoluciones que escribió anteriormente para Samsung Galaxy Ace II .

I. Resolución de pantalla : 480×800 – relación de aspecto 3: 5 = 0,6

II. getSupportedPreviewSizes – Estoy casi seguro de que estos valores son de cámara trasera. A continuación se muestra la relación de aspectos para estas resoluciones:

  2560x1920 - 0,75 2560x1536 - 0,60 2048x1536 - 0,75 2048x1232 - 0,60 960x720 - 0,75 640x480 - 0,75 

Por lo tanto, su método devolverá un Size correspondiente a 2560×1536 o 2048×1232 – estos tienen la misma relación de aspecto que la resolución de pantalla y el uso de estos valores no distorsionará la imagen. El problema para mí es que no puedo usar resoluciones tan grandes, ya que captura 6 cuadros por segundo y estos deben ser guardados en una resolución más baja.

Voy a presentar a continuación algunos resultados de un dispositivo Samsung S2 :

I. Resolución de la pantalla : 480 x 800 – relación de aspecto 3: 5 = 0,6

II. Camara trasera
un). getSupportedPreviewSizes :

 800 / 480 - 480/800 = 0,60 800 / 450 - 450/800 = 0,56 720 / 480 - 0,66 640 / 480 - 0,75 352 / 288 - 0,81 320 / 240 - 0,75 176 / 144 - 0,81 

segundo). Resoluciones de la cámara nativa:

 3264 / 2448 - 0,75 - not full screen 3264 / 1968 - 0,60 - FULL SCREEN (since has the same aspect ratio as device screen) 2048 / 1536 - 0,75 - not full screen 2048 / 1232 - 0,60 - FULL SCREEN (same aspect ratio as device screen) 800 / 480 - 0,60 - FULL SCREEN (same aspect ratio as device screen) 640 / 480 - 0, 75 - not full screen 

III. Cámara frontal
un). getSupportedPreviewSizes :

 640 / 480 - 0,75 352 / 288 - 0,81 320 / 240 - 0,75 176 / 144 - 0,81 

segundo). La cámara nativa no está en pantalla completa y no puedo elegir una resolución: la opción está desactivada.

Para S2, cámara trasera, me pregunto por qué el método getSupportedPreviewSizes() no devuelve las mismas resoluciones que la cámara nativa o las que aparecen en la cámara nativa son los tamaños de imagen? Me pregunto por qué no tengo opciones como getSupportedPreviewSizes() dado por el método getSupportedPreviewSizes() ? : Introduzca aquí la descripción de la imagen

2 Solutions collect form web for “La visualización / visualización de la cámara en pantalla completa no mantiene la relación de aspecto: la imagen está sesgada, estirada para encajar en la pantalla”

En pocas palabras, puede hacer una vista previa de la cámara en pantalla completa, sin embargo, tendrá que averiguar los tamaños adecuados entre los tamaños de vista previa admitidos por usted mismo, sólo si una vista previa de cámara personalizada es lo que desea.

Para su pregunta, de acuerdo con los desarrolladores de Android – Cámara

Si desea establecer un tamaño específico para la vista previa de su cámara, establezca esto en el método surfaceChanged() como se indica en los comentarios anteriores. Al configurar el tamaño de vista previa, debe utilizar los valores de getSupportedPreviewSizes() . No establezca valores arbitrarios en el método setPreviewSize() .

Parece que no se puede pasar manualmente el tamaño que desea, aparte de los tamaños proporciona por getSupportedPreviewSizes() . Con un examen más cercano de los tamaños compatibles con la cámara de su teléfono, usted encontrará la proporción de tamaños soportados podría no exactamente lo mismo que la proporción de la pantalla.

Por ejemplo, Samsung Galaxy Ace II tiene una pantalla de resolución de 480×800, al leer el Size devuelto por getSupportedPreviewSizes() , su cámara soporta:

2560×1920

2560×1536

2048×1536

2048×1232

960 x 720

640×480

Y si desea mostrar la vista previa de la cámara en pantalla completa correctamente (sin estiramiento), tendrá que calcular, comparar y aplicar la proporción adecuada en estos tamaños de vista previa compatibles.

La implementación de encontrar un tamaño de vista previa adecuado no es algo tan complicado. Un método común para hacer esto sería algo como esto:

  /** * Calculate the optimal size of camera preview * @param sizes * @param w * @param h * @return */ private Size getOptimalSize(List<Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.2; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { // Log.d("CameraActivity", "Checking size " + size.width + "w " + size.height + "h"); double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } SharedPreferences previewSizePref; if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) { previewSizePref = getSharedPreferences("PREVIEW_PREF",MODE_PRIVATE); } else { previewSizePref = getSharedPreferences("FRONT_PREVIEW_PREF",MODE_PRIVATE); } SharedPreferences.Editor prefEditor = previewSizePref.edit(); prefEditor.putInt("width", optimalSize.width); prefEditor.putInt("height", optimalSize.height); prefEditor.commit(); // Log.d("CameraActivity", "Using size: " + optimalSize.width + "w " + optimalSize.height + "h"); return optimalSize; } 

Y también puede hacer lo mismo para averiguar los tamaños de cámara adecuados (el tamaño de la imagen de salida).

Nota: Encontré la versión original del código anterior de Internet y hice algunas modificaciones / optimización para mi propio propósito.

Por favor, hágamelo saber si esto funciona para usted.

Yo estaba enfrentando el mismo problema en Camera2 API, he utilizado el tamaño de vista previa y la relación de aspecto de los dispositivos para resolver el problema. También puede hacer lo mismo con su API de cámara.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.