O privire asupra calității compresiei Instagram

Descoperiți dacă calitatea proastă a compresiei Instagram pentru Android este o consecință a limitărilor platformei sau a acțiunii deliberate ale dezvoltatorilor Instagram.

Aplicația Instagram pentru Android a devenit una dintre cele mai populare platforme de social media din lume astăzi. Cu peste 300 de milioane de utilizatori lunar pe toate platformele, și peste 100 de milioane de descărcări individuale pe Google Playstore, te-ai aștepta ca aplicația de partajare a instantaneelor ​​de la Facebook să se laude cu calitate atât în ​​ceea ce privește designul, cât și funcționalitatea. Din păcate, pentru o mare parte din baza sa de utilizatori - adică instagramerii Android - Instagram nu face o treabă bună la singurul lucru pe care ar trebui să-l facă - partajarea de imagini frumoase.

În timp ce utilizatorii iOS își pot împărtăși creațiile și momentele cu fidelitate ridicată, utilizatorii Android raportează pierderi extreme de calitate a imaginilor lor de ani de zile. Unul dintre cele mai vechi fire care se plânge de o astfel de durere de cap

a fost găsit aici pe XDA în septembrie 2012, iar firul a continuat până acum, oferind cititorilor modalități neortodoxe de a încerca să ocoliți distrugerea ridicolă a fotografiilor de către Instagram. Ai crede că după peste doi ani de plângeri, îmbunătățiri tehnologice atât în ​​software, cât și hardware și creștere economică și de piață, Instagram ar fi abordat aceste probleme. Este ceva pentru care sunt de vină? Sau cauza de bază a problemei este mai profundă decât pare?

O privire directă

Iată o poză pe care am făcut-o eu însumi. Fotografia originală cântărește 4,34 MB și a fost împușcat în 9,6 MP. Pentru a nu ține cont de eșantionarea „Instacrop”, care ar distruge, în mod înțeles, detaliile unui astfel de fișier de înaltă rezoluție, reducându-l ulterior la nativul Instagram Ieșire de 640 x 640 pixeli, l-am decupat la un JPG cu raportul de aspect 1:1 al încărcărilor Instagram pentru a vedea efectele directe ale algoritmului de post-procesare și compresia acestuia asupra acestui fişier.

Pur și simplu am luat decuparea JPG pătrată și am postat-o ​​pe Instagram fără filtre adăugate, efecte sau modificarea vreunei valori. Te-ai aștepta ca imaginea să arate destul de asemănătoare cu ceea ce a fost văzut inițial, dar rezultatul a fost dezamăgitor. Artefactele de compresie din jurul marginilor și gradienților de culoare sunt uimitor de vizibile chiar și pentru ochiul neantrenat. În timp ce dimensiunea fișierului de decupare original 1:1 a fost 1,6 MB, noua imagine redimensionată și comprimată este 125KB. Aceasta înseamnă că compresia a redus dimensiunea fișierului originalului cu un factor de aproape 13 - ceea ce nu este neapărat rău în unele contexte.

Interesant este că Instagram oferă o „Procesare a imaginii de înaltă calitate” care este dezactivată în mod implicit, dar când este activată, rezultatele nu par să se îmbunătățească cu adevărat, iar fișierul comprimat se află la 129KB. Aici vă ofer aceeași decupare și puteți vedea că compresia prezentă este încă destul de intensă, iar fidelitatea imaginii prezintă încă o pierdere grosieră și pixelată.

Comprimare

Algoritmii de computer oferă diverse modalități de reducere a dimensiunii unei imagini cu diferite tehnici care optimizează

datele necesare pentru a fi interpretate ulterior și pentru a afișa imaginea corespunzătoare în mod corespunzător. Multe tipuri de fișiere pentru imagini sunt strâns asociate cu aceste tehnici de compresie pe care le acceptă sau nu acceptă - și acesta este motivul pentru care vedem de obicei o calitate mai bună la unele tipuri de imagini decât alții. PNG Fișierele (Portable Network Graphics) sunt de obicei folosite pentru a partaja conținut media fără a pierde fidelitatea și calitatea imaginii, în detrimentul unei dimensiuni mai mari a fișierului decât imaginile care suferă o compresie cu pierderi. GIF este un format de imagine foarte vechi care este, de asemenea, comprimat fără pierderi.

Tehnicile de reducere sau optimizare a dimensiunii fișierelor sunt învățate de mulți programatori în activitățile lor academice, indiferent de domeniul în care se vor dezvolta. Nume precum deflaţie (folosit pentru PNG) sau Lempel-Ziv-Welch algoritm (utilizat de obicei pentru GIF) circulă prin multe săli de clasă de informatică în zilele noastre, răsună în urechile multor programatori și odată cu dezvoltarea și documentarea ulterioară a tehnicilor de compresie din ce în ce mai eficiente, te-ai aștepta ca platforma miliardarului să încorporeze algoritmi rezonabil de eficienți pentru a scoate o imagine foarte frumoasă, în timp ce aspectele tehnice nu sunt prea solicitante pentru serverele lor și pentru utilizator. hardware.

Dar pur și simplu nu este cazul. Imaginile pe care milioane de instagrameri, și eu, le facem și le încărcăm în fiecare zi contrazic direct narațiunea priceperii inginerești a acestor superputeri ale lumii tehnologiei, care ar trebui să pompeze o mare parte din veniturile lor investind înapoi în software-ul lor pentru a oferi cel mai bun utilizator experienţă. Dar aici rămâne o întrebare fără răspuns: De ce Android și nu iOS?

Memorie VSCO și Android

În timp ce forumurile populare de pe internet, cum ar fi Reddit, încercau să descopere cauza indignării lor zilnice, nedreptatea părea să nu aibă un alt fundament logic. decât posibila explicație a hardware-ului Android fiind intrinsec inferior în departamentul de putere de calcul sau faptul că, având în vedere gama largă de dispozitive Android de gamă inferioară, aceste măsuri trebuiau luate pentru a asigura o experiență de utilizator consecventă pe întreaga platformă - indiferent de cât ați plătit pentru telefonul tau. Pe măsură ce au trecut lunile, rapoartele de după fiecare actualizare Instagram au continuat să raporteze aceeași problemă, până la obiect unde această problemă a devenit o problemă în rândul utilizatorilor forumului, care au urmat la scurt timp fiecare iterație a aplicarea.

Utilizatorii au observat, de asemenea, o apariție similară cu populara aplicație de editare a imaginilor și a camerei foto VSCO Cam. Denumit „noul standard al fotografiei Android”, unii au observat rapid că aplicația nu a respectat aceste afirmații. Pierderea calității și tipul de artefacte observate au fost similare cu cele de pe Instagram, așa că unii s-au grăbit să creadă că există o linie care unește punctele. Până acum, am avut doar speculații cu privire la care ar putea fi motivul acestei probleme. Unii au dat vina problema direct pe algoritmii de eșantionare bitmap încorporați ai Android. Cu toate acestea, ceea ce părea a fi cea mai convingătoare cauză care a ieșit la suprafață a fost simplul fapt că Instagram și, eventual, VSCO, au avut o implementare proastă a unui algoritm de eșantionare, în special a Reeșantionarea celui mai apropiat vecin. Dar fără cuvântul oficial al dezvoltatorilor, speculațiile nu ar putea fi pe deplin confirmate.

Atunci am învățat Suportul tehnic al VSCO că motivul pierderii rezoluției și fidelității lor nu a fost o implementare proastă a software-ului, ci mai degrabă o constrângere de memorie în dispozitivele Android:

„Majoritatea dispozitivelor Android sunt destul de limitate în memorie, în ciuda faptului că unele au mai mult de câțiva gigaocteți de memorie, dar aplicațiilor nu li se permite să folosească toate cele disponibile memorie și astfel trebuie să ne datorăm cu ceea ce ne este dat de la Android.”

„Imaginile mari pot fi reduse cu până la 50% la import în funcție de dispozitivul pe care vă aflați și de memoria disponibilă.

De asemenea, susțin că tehnicile lor de procesare a imaginii sunt foarte solicitante atât pentru memorie, cât și pentru SoC și acest lucru, împreună cu limitările de memorie Android, este motivul pentru care vedem blocajul de calitate pe care nu îl găsim iOS.

Conform Articole de instruire pentru dezvoltatori Android, este stabilită o limită strictă pentru dimensiunea heap pentru fiecare aplicație pentru a menține un mediu multitasking funcțional. Acest lucru depinde de cantitatea RAM disponibilă pe dispozitiv și, dacă aplicația se apropie de capacitatea heap-ului, riscă să rămână fără memorie RAM.

Deci, la prima vedere, asta pare că povestea lui VSCO este convingătoare, dar asta nu explică unele dintre lucrurile pe care oamenii care adoptă o abordare sceptică nu par să le scuture.

Prescripţie

La o privire foarte superficială, putem pune această întrebare: dacă un smartphone care are de obicei între 1 GB și 2 GB RAM și Cele mai recente procesoare portabile nu pot procesa o imagine la rezoluție completă, de ce sunt capabile camerele DSLR cu 32 MB RAM acea?

Am contactat unul dintre dezvoltatorii noștri senior recunoscuți pentru a aduna o opinie mai puternică cu privire la această problemă. OmniROM dezvoltator XpLoDWilD a comentat:

„Limitarea aici este mai degrabă modul în care imaginea este calculată sau procesată. GPU-ul este mai rapid pentru asta și cel mai rapid mod de a face acest lucru este prin „încărcarea” imaginii în GPU ca textură și procesați-l - problema este că sunteți limitat de dimensiunea maximă a texturii GPU, care este în general 4096x4096.”

În general, imaginile de 8MP sunt 3264x2448, suficient de mici pentru a se încadra în limitele de până la 12MP de 4000x3000. Senzorii emblematici mai noi și senzorii cu camera-telefon pot ajunge la 13MP și au dimensiuni ale imaginii mai mari decât GPU-ul maxim dimensiunea maximă a texturii, care ar trebui inevitabil să reducă dimensiunea imaginii în cadrul constrângerii și să piardă în general detaliu.

„Problema nu este că aplicațiile sunt încărcarea unei versiuni reduse, cu toate acestea, este mai degrabă că aplicațiile sunt procesarea unei versiuni reduse a imaginii, și încărcarea acelui fișier procesat”, a adăugat el. „Cel mai probabil, pentru a reduce și mai mult timpul de procesare, au stabilit și rezoluția și mai mică”.

XpLoDWilD sugerează că echilibrul fin între timp de procesare și constrângere GPU ar fi, în loc să arate utilizatorului o previzualizare complet procesată a imaginii la care lucrează, să aibă vizual ajutor pentru procesul de editare să fie o miniatură redusă care poate încadra pe ecran (ceva mai mic decât 2048x2048). Această miniatură poate fi, în general, procesată rapid și fiabil, oferind totuși utilizatorului o bună estimare a modului în care va arăta imaginea. Când utilizatorul confirmă alegerile pe care le-a făcut cu privire la ajustările valorii și selecția filtrului, imaginea cu rezoluție completă ar fi transformat în fundal - prin împărțirea imaginii într-o grilă cu dimensiunea rezoluției miniaturii și apoi procesând fiecare bloc separat. Pasul final ar presupune compunerea imaginii finale pe CPU prin potrivirea fiecărei regiuni într-un bitmap mare de rezoluție completă.

Aceasta este o modalitate de a procesa imaginea la rezoluția originală. Acesta este ceva ce Instagram nu pare să facă, având în vedere că previzualizarea pe care o vedeți, până în momentul de față procesezi imaginea, nu are aceeași calitate teribilă și artefacte ca cele gata de încărcat imagine. Imaginea de previzualizare nu pare să sufere compresia brutală, așa că compresia are loc în momentul procesării imaginii finale - care scoate imaginea de calitate scăzută.

Platforma Android într-adevăr nu are probleme în procesarea unei imagini la rezoluție completă înaltă și cu atât mai puțin în încărcarea acesteia. Pe partea hardware, cele mai recente iPhone-uri au o limită de dimensiune a texturii de la 2048 la 4096. Deci, probabil că nu este o limitare hardware și nu este o limitare a platformei - deoarece poate și a fost rezolvată de alți dezvoltatori.

Dar a existat un plafon pentru dimensiunea grămezilor, totuși!

Da, dar nu chiar. Există o limită rezonabilă pentru heap-ul Java, din cauza memoriei suplimentare necesare pentru imagini de înaltă densitate. După câteva cercetări, am găsit acest fragment de dezbatere pe un grup Google care discuta despre Android NDK sau Kit de dezvoltare nativ, care permite dezvoltatorilor să reutilizeze codul scris în C/C++ prin introducerea acestuia în aplicații prin Interfață nativă Java, făcând execuția aplicației oarecum mai rapidă, deoarece este interpretată direct pe procesor în loc de o mașină virtuală.

În conversație, asta poate fi gasit aici, inginer Google și dezvoltator de cadru Android Dianne Hackborn înlătură unele concepții greșite despre constrângerile de memorie ale Android. Ea notează că, „Având în vedere că aceasta este lista NDK, limita de fapt nu vă este impusă, deoarece este doar pe heap-ul Java. Nu există limită a alocărilor în heap-ul nativ... “. În ceea ce privește utilizarea RAM, ea comentează: „Dacă există suficientă RAM, datele vor fi păstrate în RAM. Dacă nu... pai mai fugi”.

Ea spune, de asemenea, că nu numai că nu există nicio limită grămada nativă, dar nu există nici unul pentru Heap GPU. Deci, se pare că nu există restricții „impuse” de Android în ansamblu cu privire la cantitatea de memorie, procesare generală sau GPU pe care o puteți folosi, din cauza existenței NDK-ului.

Dar chiar și atunci, heap-ul Java ar trebui să fie suficient de mare pentru o singură imagineMONITOR. O imagine de 13MP ca bitmap necomprimat (ARGB 8888) ar dura aproximativ 50 MB. Intervalele implicite de dimensiune maximă a heap-ului până la 256mb sau512mb în funcție de dispozitivul Android și de versiunea Android pe care o rulează. Instagram durează aproximativ 62 MB când este inactiv și, judecând după graficul meu System Monitor, creșterea utilizării RAM în timpul recuperării și procesarea unei imagini de 13 MP pare a fi neglijabilă și, cu siguranță nici pe departe limita presupusă „impusă de Android”, care poate fi rezolvată indiferent și poate fi, de asemenea, evitată sau atenuată prin utilizarea anumitor algoritmi peste alții.

Concluzie

După cum sa menționat anterior, este posibil să nu cunoaștem niciodată povestea completă a ceea ce se întâmplă în culisele acestor aplicații. Dar justificările făcute de răspunsurile creatorilor lor sau de cele ale apologeților lor pur și simplu nu par chiar atât de plauzibile la o inspecție atentă. Problema aici pare să fie cauzată de implementarea software mediocră, mai degrabă decât de orice limitare pe care hardware-ul sau software-ul Android ar putea să le ofere.

Faptul că există aplicații care funcționează în jurul compresiei, plus existența și conținutul documentației despre funcționarea interioară a Androidului, potențialul de hardware-ul Android actual și opinia experților, toate par să indice că nedreptatea cu care se confruntă utilizatorii Android este fie deliberată, fie cel puțin recunoscută. rezolvabil.

Cred că este timpul ca utilizatorii de Android să obțină nu numai adevărul, ci și tratamentul pe care îl merită. Deși s-ar putea ca dispozitivele Android, în masă, deoarece media și mediana sunt sub iPhone-uri când vine vorba de hardware, nu există niciun motiv pentru a reduce standardele și a strica experiențele utilizatorilor tuturor. Și cu fiecare dezvoltator care dă platformei resturile la mâna a doua, utilizatorii își concentrează tot mai mult frustrarea pe dezvoltatori, mai degrabă decât pe sistem - așa cum ar trebui să fie.

Credit la PixelPulse pentru imaginea prezentată