Un regard sur la qualité de compression d'Instagram

L'application Instagram pour Android est devenue l'une des plates-formes de médias sociaux les plus populaires au monde. Avec plus de 300 millions d'utilisateurs mensuels sur toutes les plateformes et plus de 100 millions de téléchargements individuels sur Google Playstore, vous vous attendez à ce que l'application de partage de captures instantanées de Facebook se vante de la qualité de son design et de ses fonctionnalités. Malheureusement, pour une grande partie de sa base d'utilisateurs - c'est-à-dire les instagrammers d'Android -, Instagram ne parvient pas à faire du bon travail à la seule chose qu'il est censé faire - partager de jolies images.

Alors que les utilisateurs d’iOS peuvent partager leurs créations et leurs moments avec une grande fidélité, les utilisateurs d’Android signalent une perte de qualité extrême de leurs images depuis des années. L'un des plus anciens sujets se plaignant d'un tel mal de tête a été retrouvé ici en septembre 2012, et le sujet a fonctionné jusqu'à présent, offrant aux lecteurs des moyens peu orthodoxes d'essayer de contourner la destruction ridicule de photos par Instagram. On pourrait penser qu'après plus de deux ans de plaintes, d'améliorations technologiques des logiciels et du matériel, et de la croissance économique et du marché, Instagram aurait résolu ces problèmes. Est-ce quelque chose qu'ils sont à blâmer? Ou la cause sous-jacente du problème est-elle plus profonde qu'il n'y parait?

Un regard direct

Original

Culture 1: 1

Voici une photo que j'ai moi-même prise. Le coup d'origine pèse 4, 34 Mo et a été tourné à 9, 6 MP . Pour ne pas prendre en compte le sous-échantillonnage «Instacrop» qui détruirait naturellement le détail d'un fichier de cette résolution en le réduisant ensuite à la sortie native de 640 × 640 pixels d'Instagram, je l'ai recadré au format JPG du rapport de format 1: 1 d'Instagram. uploade pour voir les effets directs de l'algorithme de post-traitement et de sa compression sur ce fichier.

J'ai simplement saisi le recadrage JPG au carré et l'ai posté sur mon compte Instagram sans filtres, effets ni modifications de valeur ajoutés. Vous vous attendriez à ce que l'image paraisse assez semblable à ce que vous aviez vu à l'origine, mais le résultat était décevant. Les artefacts de compression autour des bordures et des dégradés de couleurs sont remarquablement remarquables, même pour un œil non averti. Alors que la taille du fichier de recadrage 1: 1 d'origine était de 1, 6 Mo, la nouvelle image compressée et redimensionnée a une taille de 125 Ko . Cela signifie que la compression a réduit de près de 13 la taille du fichier de l'original , ce qui n'est pas forcément mauvais dans certains contextes.

Fait intéressant, Instagram propose un «traitement d'image de haute qualité» qui est désactivé par défaut, mais lorsqu'il est activé, les résultats ne semblent pas vraiment s'améliorer et le fichier compressé se situe à 129 Ko . Ici, je vous fournis le même recadrage et vous pouvez voir que la compression présente est encore assez intense et que la fidélité de l'image présente toujours une perte grossière et pixellisée.

Compressé avec traitement de haute qualité désactivé

Compressé avec traitement de haute qualité activé

Compression

Les algorithmes informatiques offrent divers moyens de réduire la taille d’une image avec différentes techniques qui optimisent la

les données doivent ensuite être interprétées et afficher l'image appropriée de la manière appropriée. De nombreux types de fichiers pour les images sont étroitement associés à ces techniques de compression, qu’ils prennent en charge ou non - et c’est pourquoi nous constatons généralement une meilleure qualité de certains types d’images que d’autres. Les fichiers PNG (Portable Network Graphics) sont généralement utilisés pour partager un contenu multimédia sans perte de fidélité ni de qualité d'image, au détriment d'une taille de fichier supérieure à celle des images soumises à une compression avec perte. Le format GIF est un très vieux format d’image compressé sans perte.

De nombreux programmeurs apprennent des techniques permettant de réduire ou d’optimiser la taille des fichiers, quel que soit le domaine dans lequel ils se développeront. Des noms tels que déflation (utilisé pour PNG ) ou algorithme de Lempel-Ziv-Welch (généralement utilisé pour GIF ) De nos jours, de nombreuses salles de classe d'informatique résonnent dans les oreilles de nombreux programmeurs. Avec le développement et la documentation de techniques de compression de plus en plus efficaces, vous vous attendriez à ce que la plate-forme milliardaire incorpore des algorithmes raisonnablement efficaces pour produire une très belle image tout en évitant les détails techniques. trop taxer sur leurs serveurs et le matériel de l'utilisateur.

Mais ce n'est tout simplement pas le cas. Les photos que des millions de Instagrammers et moi-même prenons et téléchargeons chaque jour contredisent directement le récit de la prouesse technique de ces superpuissances du monde de la technologie, qui sont supposées rapporter une grande partie de leurs revenus en réinvestissant dans leurs logiciels pour fournir la meilleure expérience utilisateur. Mais il reste encore une question sans réponse ici: Pourquoi Android et non iOS?

VSCO et mémoire Android

Alors que des forums Internet populaires comme Reddit tentaient de déterminer la cause de leur scandale quotidien, l'injustice semblait n'avoir aucun fondement logique autre que l'explication possible du fait que le matériel Android était intrinsèquement inférieur au service de la puissance de calcul, ou le fait Une vaste gamme d'appareils Android bas de gamme, ces mesures ont dû être prises pour garantir une expérience utilisateur cohérente sur l'ensemble de la plate-forme, quel que soit le prix de votre téléphone. Au fil des mois, les rapports après chaque mise à jour Instagram continuaient à signaler le même problème, à tel point que ce problème était devenu un gag en cours parmi les utilisateurs du forum, qui suivait peu après chaque itération de l'application.

Les utilisateurs ont également remarqué un événement similaire avec VSCO Cam, l'application de retouche d'images très populaire. Vantés «le nouveau standard de la photographie Android», certains ont vite remarqué que la demande n’avait pas été retenue. La perte de qualité et le type d'artefacts observés étaient similaires à ceux d'Instagram. Certains ont donc rapidement pensé qu'il existait une ligne unissant les points. Jusqu'à présent, nous ne spéculions que sur la raison de ce problème. Certains ont attribué le problème directement aux algorithmes de sous-échantillonnage bitmap intégrés d'Android. Cependant, ce qui semblait être la cause la plus convaincante qui avait été évoquée était le simple fait qu'Instagram, et probablement VSCO, appliquait mal un algorithme de sous-échantillonnage, en particulier le rééchantillonnage du voisin le plus proche. Mais sans le mot officiel des développeurs, la spéculation ne pourrait être pleinement confirmée.

C'est alors que nous avons appris par le support technique de VSCO que la raison de leur perte de résolution et de fidélité n'était pas une mauvaise implémentation logicielle, mais plutôt une contrainte de mémoire dans les appareils Android:

«La plupart des appareils Android sont assez limités en mémoire, même s'ils disposent de plus de quelques gigaoctets de mémoire, mais les applications ne sont pas autorisées à utiliser toute la mémoire disponible et nous devons donc en tenir compte avec ce qui nous a été fourni par Android.»

«Les images volumineuses peuvent être réduites jusqu'à 50% lors de l'importation en fonction du périphérique utilisé et de la mémoire disponible.

Ils affirment également que leurs techniques de traitement des images sont très éprouvantes pour la mémoire et les systèmes sur puce, ce qui, associé aux limitations de la mémoire Android, explique pourquoi nous constatons le goulot d'étranglement de qualité que nous ne trouvons pas sur iOS.

Selon les articles de formation de développeurs d'Android, une limite stricte est définie pour la taille de segment de mémoire pour chaque application afin de maintenir un environnement multitâche fonctionnel. Cela dépend de la quantité de RAM dont dispose le périphérique. Si l'application approche de la capacité de stockage, elle court le risque de manquer de RAM.

Donc, à première vue, il semble que l'histoire de VSCO soit convaincante, mais cela n'explique pas en partie les choses que les personnes qui adoptent l'approche sceptique n'arrivent pas à se dégager.

Limitation

De manière très superficielle, nous pouvons poser la question suivante: si un smartphone disposant généralement de 1 Go à 2 Go de RAM et des processeurs portables les plus récents ne peut pas traiter une image en pleine résolution, pourquoi les appareils photo reflex numériques à 32 Mo de RAM en sont-ils capables?

Nous avons contacté l'un de nos développeurs reconnus et reconnus pour obtenir un avis plus fort sur cette question. Le développeur OmniROM XpLoDWilD a commenté:

«La limitation ici est plutôt la façon dont l'image est calculée ou traitée. Le GPU est plus rapide pour cela, et le moyen le plus rapide de le faire est de "télécharger" l'image dans le GPU en tant que texture et de la traiter. Le problème, c'est que vous êtes limité par la taille de texture maximale du GPU, généralement 4096 × 4096. ”

En général, les images 8 MP sont 3264 × 2448, suffisamment petites pour s’inscrire dans les limites de 12 MP à 4000 × 3000. Les capteurs phares plus récents et les téléphones-appareils photo peuvent atteindre des résolutions allant jusqu'à 13 MP et avoir des tailles d'image supérieures à la taille de texture maximale du GPU, ce qui obligerait inéluctablement à réduire la taille de l'image dans la contrainte et à perdre les détails généraux.

"Le problème n'est pas que les applications téléchargent une version réduite, cependant, c'est plutôt qu'elles traitent une version réduite de l'image et téléchargent ce fichier traité", a-t-il ajouté. "Très probablement pour réduire davantage le temps de traitement, ils ont également réglé la résolution encore plus bas".

XpLoDWilD suggère que l'équilibre précis entre le temps de traitement et la contrainte du GPU serait, plutôt que de montrer à l'utilisateur un aperçu entièrement traité de l'image sur laquelle il travaille, que l'aide visuelle pour le processus de montage soit une vignette à l'échelle pouvant s'adapter à l'écran. (quelque chose de plus petit que 2048 × 2048). Cette vignette peut généralement être traitée de manière fiable et rapide, tout en offrant à l'utilisateur une bonne estimation de l'aspect de la photo. Lorsque l'utilisateur confirme les choix qu'il a faits pour les réglages de valeur et la sélection du filtre, l'image en résolution complète est transformée en arrière-plan - en scindant l'image dans une grille de la taille de la résolution de la vignette, puis en traitant chaque bloc séparément. La dernière étape consisterait à composer l'image finale sur la CPU en adaptant chaque région dans un grand bitmap à résolution complète.

C'est une façon de traiter l'image dans la résolution d'origine. Cela ne semble pas être le cas d'Instagram, étant donné que l'aperçu que vous voyez, jusqu'au moment où vous traitez l'image, ne présente pas la même qualité et les mêmes artefacts que ceux du prêt à télécharger. image. L'aperçu de l'image ne semble pas subir de compression brutale. La compression a donc lieu au moment du traitement de l'image finale, qui produit une image de qualité médiocre.

La plate-forme Android n'a vraiment aucun problème à traiter une image en haute résolution et beaucoup moins à la télécharger. Du côté matériel, les derniers iPhones ont une taille limite de texture allant de 2048 à 4096. Donc, ce n'est probablement pas une limitation matérielle, ni une limitation de plate-forme - comme cela peut et a été contourné par d'autres développeurs.

Mais il y avait un plafond à la taille du tas, cependant!

Oui mais pas tout à fait. Le segment de mémoire Java est limité raisonnablement en raison de la mémoire supplémentaire requise pour les images haute densité. Après quelques recherches, j'ai trouvé cet extrait de débat sur un groupe de Google traitant du NDK Android, ou Kit de développement natif, qui permet aux développeurs de réutiliser le code écrit en C / C ++ en l'introduisant dans des applications via Java Native Interface, ce qui rend l'exécution de l'application est un peu plus rapide car elle est directement interprétée par le processeur et non par une machine virtuelle.

Dans la conversation, que l'on peut trouver ici, Dianne Hackborn, ingénieure de Google et développeur de framework Android, élimine certaines idées fausses sur les contraintes de mémoire d'Android. Elle note que «étant donné qu'il s'agit de la liste NDK, la limite ne vous est en réalité pas imposée, car elle ne concerne que le segment de mémoire Java. Il n'y a pas de limite sur les allocations dans le tas natif… “ . En ce qui concerne l'utilisation de la RAM, elle commente: «S'il y a assez de RAM, les données seront conservées dans la RAM. Sinon… eh bien, tu cours quand même ».

Elle dit également que non seulement il n'y a pas de limite sur le tas natif, mais il n'y en a pas non plus pour le tas GPU. Il semble donc qu'il n'y ait vraiment aucune restriction «imposée» par Android dans son ensemble quant à la quantité de mémoire, au traitement général ou au GPU que vous pouvez utiliser, en raison de l'existence du NDK.

Mais même dans ce cas, le tas de Java devrait être assez grand pour une image

. Une image 13MP sous forme de bitmap non compressé (ARGB 8888) prend environ 50 Mo. La taille de tas maximale par défaut va jusqu'à 256 Mo ou 512 Mo en fonction du périphérique Android et de la version Android sur laquelle il est exécuté. Instagram prend environ 62 Mo en veille, et à en juger par le graphique du Moniteur système, l'utilisation de la RAM augmente pendant la récupération et le traitement d'une image 13 MP semble être négligeable, et certainement loin de la limite supposée «imposée par Android», qui peut être contourné indépendamment de tout, et il peut également être évité ou atténué en utilisant certains algorithmes sur d'autres.

Conclusion

Comme mentionné précédemment, il est possible que nous ne sachions jamais toute l'histoire de ce qui se passe dans les coulisses de ces applications. Mais les justifications apportées par les réponses de leurs décideurs ou celles de leurs apologistes ne semblent tout simplement pas si plausibles si on les examine de près. Le problème ici semble être causé par une implémentation logicielle médiocre plutôt que par toute limitation que le matériel ou le logiciel d'Android pourrait apparemment fournir.

Le fait qu'il existe des applications qui fonctionnent autour de la compression, ainsi que l'existence et le contenu de la documentation sur le fonctionnement interne d'Android, le potentiel du matériel Android actuel et l'opinion des experts, semblent tous indiquer l'injustice à laquelle sont confrontés les utilisateurs d'Android. délibérée ou à tout le moins reconnue de manière solvable.

Je pense qu'il est temps que les utilisateurs d'Android obtiennent non seulement la vérité, mais également le traitement qu'ils méritent. Même s’il est possible que les appareils Android, en masse, car la moyenne et la médiane sont inférieures à l’iPhone en ce qui concerne le matériel, il n’ya aucune raison de baisser les normes et de gâcher les expériences de tous les utilisateurs. Et avec chaque développeur donnant à la plate-forme des restes d'occasion, les utilisateurs concentrent de plus en plus leur frustration sur les développeurs plutôt que sur le système, comme il se doit.

Crédit à PixelPulse pour l'image sélectionnée