Publicación de una foto usecase en android y servidor

Quiero tener la publicación de una foto usecase en mi aplicación para Android.

Este es el escenario que he implementado:

1. El usuario publica una foto.

2. En el lado del cliente escalar la foto *, comprimirla y enviarla al servidor.

3. Almacenar la foto en el servidor.

4. Los usuarios, que pueden ver la foto, buscan la foto desde el servidor.

El problema con este enfoque es que no tiene en cuenta el problema de diferentes tamaños de pantalla.

Digamos que el usuario A publica una foto.

El usuario B , que tiene un teléfono con una pantalla más grande **, recupera la foto del servidor. La foto no encaja bien en el entorno ya que tiene anchura y altura fijadas por el usuario A (escalado en el paso 2).

No puedo simplemente escalar la foto y ponerla en ImageView del usuario B, porque me arriesgo a perder la relación de aspecto de la foto.

Un enfoque que viene a la mente es simplemente eliminar el paso 2 del escenario. Envío la foto al servidor, y cuando un usuario intenta buscarla, escala la imagen según el tamaño de pantalla del usuario (que recibo como parámetros en la solicitud de búsqueda).

El problema con este enfoque es que, en cada solicitud, tendré que escalar la foto sobre la marcha y enviarla al cliente. Otro problema es la eficiencia de la carga de una foto, porque no escala la foto (antes de cargarla). Se necesita mucho más tiempo para cargar una foto completa de 2 MB (o incluso 500 KB) que cargar una foto escalada (~ 20 KB).

¿Cuáles son mis opciones? Ya que soy relativamente nuevo para Android, lo más probable es que me falte algo esencial.

¡Aclamaciones!


* Escala que mantiene la relación de aspecto.

** Lo siento por la terminología, no sé cómo y cuándo utilizar alta densidad / píxeles correctamente. Todos los derechos reservados

Tengo propio servidor dedicado con tráfico ilimitado y 4T HDD. Por lo tanto, básicamente lo que hago es:

  1. El usuario toma una foto por teléfono
  2. Imagen de subida de usuario al servidor web
  3. Uso de ImageMagick + mozjpeg 3 Redimensiono la imagen 3 veces y guardarla con prefijos small_, medium_, large_ O con prefijos pre size: 1024_, 640 _…
  4. Ahora, mi aplicación puede encontrar las dimensiones de la pantalla del usuario y cargar la imagen haciendo la solicitud de prefijo especificado.

Mis argumentos para hacer en esta guerra son:

  1. Libre tráfico
  2. Disco duro grande
  3. Rápida velocidad de Internet del usuario
  4. Cuando cargue en otro subproceso y muestre al usuario otra actividad, no siente el "tiempo de espera largo" para cargar imágenes grandes.
  5. Siempre puede cambiar el tamaño de la foto en el dispositivo, de 10Mb a 2Mb, por ejemplo, y en el servidor hacer otros cambios de tamaño.

Ahora sobre la relación de imagen. Allí no se puede hacer mucho. Debe decidir qué hacer en caso de que el usuario con pantalla grande y su propia relación de aspecto intente cargar la imagen que haya cargado el usuario con pantalla pequeña y relación de aspecto propia.

La verdad es que el tamaño de la pantalla no importa. Lo que es materia es una relación. Por lo tanto, puede cargar la imagen, ponerla en ImageView, y esto se llena de fondo negro si la imagen es "menor". Si puede cargar un gran tamaño de imagen, recórtelo y colóquelo en ImageView. La imagen más grande se utiliza sólo para una mejor calidad.

En mi caso, siempre hago imágenes de recorte si lo uso como vista previa. Creo que se ve más hermosa. Cuando el usuario quiere ver la imagen a tamaño completo, descarga la imagen completa y mostrarla como está.

Un buen servidor que maneja imágenes debería:

  • recibir imágenes de alta calidad
  • guardar o almacenar en caché las imágenes en varios tamaños (pequeño, medio, grande)
  • servir imágenes de acuerdo a un parámetro de tamaño (los teléfonos más grandes piden la imagen grande)

Hay muchas soluciones para este tipo de servidor. La mayoría de ellos redimensionan la imagen sobre la marcha y almacenan en caché el resultado. El cliente le dice al servidor qué tamaño quiere. Un ejemplo es el manejo de imágenes en Google Play. Ir a la página web de reproducción y ver las urls de los iconos de la aplicación ( ejemplo ). Tienen un parámetro de anchura.

También puede pensar en una dimensión máxima (como 2048px) y cambiar el tamaño de la imagen antes de cargar sólo si es necesario.

El cliente que ve la imagen necesita decidir qué tamaño pide desde el servidor o puede cambiar el tamaño de la imagen en el teléfono, en lugar de confiar en el servidor. Haga esto si el tráfico no es un problema. Considere el uso de Picasso o Glide para facilitar las cosas.

Respecto a la relación de aspecto: El cliente que ve la imagen debe manejar esto. Debe esperar cualquier relación de aspecto y estar preparado para ello. Usa android: scaleType en el ImageView y decide qué tipo de escala se ajusta a tu escenario. Aquí están los tipos de escala. Si no desea líneas negras y desea ocupar todo lo posible de la pantalla, utilice CENTER_CROP, pero podría terminar perdiendo partes de la imagen.

En la mayoría de las aplicaciones se agrega la relación de aspecto original en el mantenimiento y dos "rayas" negras si la pantalla no coincide.

Creo que no es posible gestionar todas las relaciones de pantalla …

ImageView tiene android:scaleType attr que preserva la ración de aspecto para ser roto,
como fitCenter o centerInside Y también calcular el tamaño de la imagen centerInside y establecer el tamaño de la vista por ti mismo.

  • ¿Cómo se conectan las aplicaciones Android populares a un servidor?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.