Dlaczego odnowione zdjęcie może być większym plikiem niż skan
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.
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.
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.