Blog / Inżynieria

Dlaczego odnowione zdjęcie może być większym plikiem niż skan

· opis pomiarów · dane: porównanie koderów produkcyjnych

Zaczęło się od obserwacji użytkownika: odnowiony plik do pobrania był większy niż zdjęcie, które przesłał, co intuicyjnie wydaje się niewłaściwe dla „naprawy”. Pomiary wskazały dwie niezależne przyczyny: jedna to produkt działający zgodnie z zamierzeniem, druga to prawdziwe marnotrawstwo, które następnie usunęliśmy.

Przyczyna 1: wynik naprawdę ma ~6× więcej pikseli

Renowacja obejmuje ulepszanie całego obrazu: typowy skan 821×1024 (0,84 megapiksela) wraca jako 2052×2560 (5,25 megapiksela), 6,25× więcej pikseli, z prawdziwymi zsyntetyzowanymi detalami w tych pikselach, a nie rozciągniętymi kopiami. Więcej informacji, więcej bajtów. Ta część to funkcja.

8211024
Przesłany plik0,84 MP
20522560
Odnowione wyjście5,25 MP
Rys. 1. Wejście i wyjście tej samej renowacji, narysowane w skali. Wyjście ma 6,25× więcej pikseli niż przesłany plik.

Przyczyna 2: kodery PNG w przeglądarce są rozdęte o 20–40%

Część marnotrawna: aplikacja pierwotnie kodowała pliki do pobrania w przeglądarce wbudowanym koderem PNG z API płótna. W porównaniu z porządnym koderem optymalizującym przy maksymalnych ustawieniach bezstratnych koder płótna tworzył pliki o 20–40% większe dla identycznych co do piksela wyników. PNG jest bezstratny tak czy inaczej; dodatkowe bajty nie kupowały niczego.

Rys. 2. Te same odnowione piksele, zakodowane na dwa sposoby. Kodowanie z maksymalną kompresją i adaptacyjnym filtrowaniem zmniejszyło plik o 45% bez żadnej różnicy w jakości; PNG jest bezstratny w obu przypadkach.

Serwer koduje teraz wynikowy PNG raz, z maksymalną kompresją bezstratną, a klient używa dokładnie tych bajtów do pobrania, zamiast kodować ponownie przez płótno. To ponowne użycie jest poprawne z konstrukcji: pobierany blob to ten sam, z którego namalowano płótno, więc piksele nie mogą się różnić.

Czego celowo nie zrobiliśmy

Nie dodaliśmy stratnych formatów wyjściowych w pogoni za mniejszą liczbą. Renowacja to kopia archiwalna, więc przycisk pobierania daje Ci PNG i nic innego; w JPEG ani WebP nie zostało już żadnej darmowej bezstratnej wygranej do zebrania. A zdjęcia przetwarzane w trybie zapasowym na urządzeniu zachowują koder przeglądarki; te przebiegi w ogóle nie dotykają naszych serwerów.

Praktyczny wniosek

Jeśli Twój odnowiony plik jest większy niż skan, sprawdź jego wymiary w pikselach, zanim założysz marnotrawstwo: przy 6× więcej pikselach nieco większy plik to spodziewany wynik, a mniejszy oznaczałby, że detale zostały wyrzucone.