Una mirada a la calidad de compresión de Instagram

La aplicación de Instagram para Android se ha convertido en una de las plataformas de redes sociales más populares en el mundo de hoy. Con más de 300 millones de usuarios mensuales en todas las plataformas y más de 100 millones de descargas individuales en Google Playstore, esperaría que la aplicación para compartir instantáneas de Facebook presuma de calidad tanto en diseño como en funcionalidad. Desafortunadamente, para una gran parte de su base de usuarios, es decir, los instagrammers de Android, Instagram no logra hacer un buen trabajo en lo único que se supone que debe hacer: compartir imágenes bonitas.

Mientras que los usuarios de iOS pueden compartir sus creaciones y momentos con alta fidelidad, los usuarios de Android han reportado una pérdida de calidad extrema en sus imágenes durante años. Uno de los hilos más antiguos que se quejaban de tal dolor de cabeza fue encontrado aquí en septiembre de 2012, y el hilo se ha estado ejecutando hasta ahora, brindando a los lectores formas poco ortodoxas de tratar de sortear la ridícula destrucción de fotos de Instagram. Se podría pensar que después de más de dos años de quejas, mejoras tecnológicas en software y hardware, y crecimiento económico y de mercado, Instagram habría abordado estos problemas. ¿Es algo de lo que tienen la culpa? ¿O la causa subyacente del problema es más profunda de lo que parece?

Una mirada directa

Original

Cultivo 1: 1

Aquí hay una foto que me tomé. El disparo original pesa 4.34 MB y se disparó a 9.6 MP . Para no tener en cuenta la disminución de la resolución "Instacrop" que comprensiblemente destruiría el detalle de un archivo de tan alta resolución reduciéndolo posteriormente a la salida nativa de 640 × 640 píxeles de Instagram, lo recorté a un JPG de la relación de aspecto 1: 1 de Instagram cargas para ver los efectos directos del algoritmo de procesamiento posterior y su compresión en este archivo.

Simplemente agarré el recorte JPG al cuadrado y lo publiqué en mi Instagram sin agregar filtros, efectos o ajustar ningún valor. Es de esperar que la imagen se vea bastante similar a lo que se vio originalmente, pero el resultado fue decepcionante. Los artefactos de compresión alrededor de los bordes y los gradientes de color son notablemente notables incluso para el ojo inexperto. Mientras que el tamaño original del archivo de recorte 1: 1 era 1, 6 MB, la nueva imagen redimensionada y comprimida es de 125 KB . Esto significa que la compresión redujo el tamaño del archivo original en un factor de casi 13, lo que no es necesariamente malo en algunos contextos.

Curiosamente, Instagram ofrece un "Procesamiento de imagen de alta calidad" que está desactivado de forma predeterminada, pero cuando se activa, los resultados no parecen mejorar realmente, y el archivo comprimido se encuentra en 129 KB . Aquí le proporciono el mismo recorte y puede ver que la compresión actual sigue siendo bastante intensa y la fidelidad de la imagen todavía presenta una pérdida gruesa y pixelada.

Comprimido con procesamiento de alta calidad desactivado

Comprimido con procesamiento de alta calidad activado

Compresión

Los algoritmos informáticos ofrecen varias formas de reducir el tamaño de una imagen con diferentes técnicas que optimizan

los datos necesarios para luego ser interpretados y mostrar la imagen apropiada de la manera apropiada. Muchos tipos de archivos para imágenes están estrechamente asociados con estas técnicas de compresión que admiten o no, y es por eso que generalmente vemos una mejor calidad en algunos tipos de imágenes que en otros. Los archivos PNG (Portable Network Graphics) generalmente se usan para compartir medios sin perder fidelidad y calidad de imagen, a expensas de un tamaño de archivo más grande que las imágenes que sufren compresión con pérdida. GIF es un formato de imagen muy antiguo que también se comprime sin pérdidas.

Muchos programadores aprenden técnicas para reducir u optimizar el tamaño de los archivos en sus actividades académicas, independientemente del campo en el que se desarrollen. Los nombres como la deflación (utilizada para PNG ) o el algoritmo Lempel-Ziv-Welch (normalmente utilizado para GIF ) se ejecutan a través de muchas aulas de informática hoy en día, suenan en los oídos de muchos programadores, y con el mayor desarrollo y documentación de técnicas de compresión cada vez más eficientes, se esperaría que la plataforma multimillonaria incorpore algoritmos razonablemente eficientes para generar una imagen muy agradable al mismo tiempo que los tecnicismos no demasiado exigente en sus servidores y el hardware del usuario.

Pero este simplemente no es el caso. Las imágenes que millones de instaladores de Instagram y yo tomamos y subimos todos los días contradicen directamente la narrativa de la destreza de ingeniería de estas superpotencias del mundo tecnológico, que se supone que generan una gran fracción de sus ingresos al invertir nuevamente en su software para proporcionar La mejor experiencia de usuario. Pero todavía queda una pregunta sin responder aquí: ¿Por qué Android y no iOS?

VSCO y memoria de Android

Mientras que los foros populares de Internet como Reddit intentaban descubrir la causa de su indignación diaria, la injusticia parecía no tener una base lógica más que la posible explicación de que el hardware de Android es intrínsecamente inferior en el departamento de potencia informática, o el hecho de que, dado el Una amplia gama de dispositivos Android de gama baja, estas medidas tuvieron que tomarse para garantizar una experiencia de usuario consistente en toda la plataforma, independientemente de cuánto pagó por su teléfono. A medida que pasaban los meses, los informes después de cada actualización de Instagram seguían informando el mismo problema, hasta el punto en que este problema se convirtió en una mordaza entre los usuarios del foro que seguía poco a poco cada iteración de la aplicación.

Los usuarios también notaron una ocurrencia similar con la popular aplicación de cámara y edición de imágenes VSCO Cam. Promocionado "el nuevo estándar de la fotografía de Android", algunos se dieron cuenta rápidamente de que la aplicación no cumplió con estas afirmaciones. La pérdida de calidad y el tipo de artefactos notados fueron similares a los de Instagram, por lo que algunos pensaron rápidamente que había una línea que unía los puntos. Hasta ahora, solo teníamos especulaciones sobre cuál podría ser la razón de este problema. Algunos atribuyeron el problema directamente a los algoritmos de disminución de mapa de bits incorporados de Android. Sin embargo, lo que parecía ser la causa más convincente que había surgido era el simple hecho de que Instagram, y posiblemente VSCO, tenían una implementación deficiente de un algoritmo de disminución de resolución, específicamente el remuestreo del vecino más cercano. Pero sin la palabra oficial de los desarrolladores, la especulación no podría confirmarse por completo.

Fue entonces cuando supimos a través del soporte técnico de VSCO que la razón de su pérdida de resolución y fidelidad no era una mala implementación de software, sino más bien una restricción de memoria en los dispositivos Android:

"La mayoría de los dispositivos Android están bastante limitados en la memoria a pesar de que algunos tienen más de unos pocos gigabytes de memoria, pero las aplicaciones no pueden usar toda esa memoria disponible y, por lo tanto, tenemos que cumplir con lo que se nos da desde Android".

“Las imágenes grandes pueden reducirse hasta un 50% al importar, dependiendo del dispositivo en el que se encuentre y la memoria disponible. "

También afirman que sus técnicas de procesamiento de imágenes son muy exigentes tanto para la memoria como para el SoC, y esto, junto con las limitaciones de memoria de Android, es la razón por la que vemos el cuello de botella de calidad que no encontramos en iOS.

Según los artículos de capacitación para desarrolladores de Android, se establece un límite estricto en el tamaño de almacenamiento dinámico para cada aplicación para mantener un entorno de multitarea funcional. Esto depende de la cantidad de RAM disponible en el dispositivo, y si la aplicación se acerca a la capacidad de almacenamiento dinámico, corre el riesgo de quedarse sin RAM.

Entonces, a primera vista, parece que la historia de VSCO es convincente, pero esto no explica algunas de las cosas que las personas que adoptan el enfoque de un escéptico no pueden evitar.

Limitación

En una mirada muy superficial, podemos hacer esta pregunta: si un teléfono inteligente que generalmente tiene entre 1 GB y 2 GB de RAM y lo último en procesadores portátiles no puede procesar una imagen en resolución completa, ¿por qué las cámaras DSLR de 32 MB de RAM son capaces de eso?

Nos comunicamos con uno de nuestros desarrolladores reconocidos senior para obtener una opinión más sólida sobre este tema. El desarrollador de OmniROM XpLoDWilD comentó:

“La limitación aquí es más bien la forma en que se calcula o procesa la imagen. La GPU es más rápida para eso, y la forma más rápida de hacerlo es 'cargar' la imagen en la GPU como una textura y procesarla; el problema es que está limitado por el tamaño máximo de textura de la GPU, que generalmente es 4096 × 4096 ".

En general, las imágenes de 8MP son 3264 × 2448, lo suficientemente pequeñas como para caber en los límites de hasta 12MP de 4000 × 3000. Los sensores insignia más nuevos y los teléfonos con cámara pueden superar los 13 MP y tienen tamaños de imagen más grandes que el tamaño máximo de textura máximo de GPU, lo que inevitablemente necesitaría reducir la imagen dentro de la restricción y perder detalles generales.

"El problema no es que las aplicaciones estén cargando una versión reducida, sino que las aplicaciones están procesando una versión reducida de la imagen y están cargando ese archivo procesado", agregó. "Lo más probable es que para reducir aún más el tiempo de procesamiento, también establecen la resolución aún más baja".

XpLoDWilD sugiere que el equilibrio entre el tiempo de procesamiento y la restricción de GPU sería, en lugar de mostrar al usuario una vista previa completamente procesada de la imagen en la que está trabajando, que la ayuda visual para el proceso de edición sea una miniatura reducida que pueda caber en la pantalla (algo más pequeño que 2048 × 2048). Esta miniatura generalmente se puede procesar de manera confiable y rápida, al tiempo que le da al usuario una buena estimación de cómo se verá la imagen. Cuando el usuario confirma las elecciones que hizo sobre los ajustes de valor y la selección del filtro, la imagen de resolución completa se transformaría en segundo plano, dividiendo la imagen en una cuadrícula del tamaño de resolución de la miniatura y luego procesando cada bloque por separado. El paso final implicaría la composición de la imagen final en la CPU ajustando cada región de nuevo en un gran mapa de bits de resolución completa.

Esa es una forma de procesar la imagen en la resolución original. Esto es algo que Instagram no parece hacer, dado que la vista previa que ve, hasta el momento en que procesa la imagen, no presenta la misma calidad y artefactos terribles que los de la lista para cargar imagen. La imagen de vista previa no parece sufrir una compresión brutal, por lo que la compresión se lleva a cabo en el momento de procesar la imagen final, que genera la imagen de baja calidad.

La plataforma Android realmente no tiene problemas para procesar una imagen en alta resolución completa y mucho menos para cargarla. En el lado del hardware, los últimos iPhones tienen un límite de tamaño de textura de 2048 a 4096. Por lo tanto, probablemente no sea una limitación de hardware, y no es una limitación de plataforma, ya que puede, y ha sido, trabajado por otros desarrolladores.

¡Pero había un límite para el tamaño del montón!

Sí, pero no del todo. Hay un límite razonable en el montón de Java, debido a la memoria adicional necesaria para imágenes de alta densidad. Después de algunas investigaciones, encontré este fragmento de debate en un grupo de Google que discute el NDK de Android, o Native Development Kit, que permite a los desarrolladores reutilizar el código escrito en C / C ++ introduciéndolo en aplicaciones a través de Java Native Interface, haciendo la ejecución de la aplicación es algo más rápida ya que se interpreta directamente en el procesador en lugar de en una máquina virtual.

En la conversación, que se puede encontrar aquí, la ingeniera de Google y desarrolladora de Android Framework, Dianne Hackborn, aclara algunos conceptos erróneos sobre las limitaciones de memoria de Android. Ella señala que, “dado que esta es la lista NDK, el límite en realidad no se te impone, porque solo está en el montón de Java. No hay límite en las asignaciones en el montón nativo ... " . En cuanto al uso de RAM, ella comenta: “Si hay suficiente RAM, los datos se mantendrán en RAM. Si no ... bueno, todavía corres ".

También dice que no solo no hay límite para el montón nativo, sino que tampoco hay uno para el montón de GPU. Por lo tanto, parece que realmente no hay restricciones "impuestas" por Android en su conjunto en cuanto a la cantidad de memoria, procesamiento general o GPU que puede usar, debido a la existencia del NDK.

Pero incluso entonces, el montón de Java debería ser lo suficientemente grande para una imagen

. Una imagen de 13MP como un mapa de bits sin comprimir (ARGB 8888) tomaría aproximadamente 50 MB . El tamaño de almacenamiento dinámico máximo predeterminado varía hasta 256mb o 512mb dependiendo del dispositivo Android y la versión de Android que está ejecutando. Instagram ocupa aproximadamente 62 MB cuando está inactivo y, a juzgar por mi gráfico de System Monitor, el uso de RAM aumenta durante la recuperación y el procesamiento de una imagen de 13MP parece insignificante, y ciertamente no se acerca al límite supuestamente "impuesto por Android", que se puede evitar independientemente, y también se puede evitar o mitigar mediante el uso de ciertos algoritmos sobre otros.

Conclusión

Como se mencionó anteriormente, es posible que nunca sepamos la historia completa de lo que sucede detrás de escena de estas aplicaciones. Pero las justificaciones hechas por las respuestas de sus creadores o las de sus apologistas simplemente no parecen tan plausibles después de una inspección minuciosa. El problema aquí parece ser causado por una implementación de software mediocre en lugar de cualquier limitación que aparentemente el hardware o software de Android pueda proporcionar.

El hecho de que existen aplicaciones que funcionan en torno a la compresión, más la existencia y el contenido de la documentación sobre el funcionamiento interno de Android, el potencial del hardware actual de Android y la opinión de los expertos, todo apunta a la injusticia que enfrentan los usuarios de Android. deliberado o al menos reconociblemente solucionable.

Creo que es hora de que los usuarios de Android no solo obtengan la verdad, sino también el tratamiento que merecen. Si bien podría ser que los dispositivos Android, en masa, como promedio y mediana estén por debajo de los iPhones en lo que respecta al hardware, no hay razón para reducir los estándares y arruinar las experiencias de los usuarios sobre ellos. Y con cada desarrollador dando a la plataforma las sobras de segunda mano, los usuarios centran cada vez más su frustración en los desarrolladores en lugar del sistema, como debería ser.

Crédito a PixelPulse por imagen destacada