shadcn.io— tysiące gotowych bloków shadcn/ui
Przejdź do treści

Jak naprawdę działa konwersja obrazów w przeglądarce (i czemu tak ją zbudowałem)

Powodem, dla którego cała ta strona istnieje, jest drobna, głupia chwila niepokoju sprzed lat. Potrzebowałem skonwertować jedno zdjęcie HEIC na JPG, wpisałem w wyszukiwarkę oczywistą rzecz i trafiłem na konwerter, który chciał, żebym wgrał obraz na ich serwer. No to wgrałem. Zadziałało. A potem siedziałem, myśląc: to zdjęcie leży teraz na jakiejś maszynie, o której nic nie wiem, prowadzonej przez ludzi, których nigdy nie poznam, trzymane przez czas, o którym nikt mi nie powiedział. Dla przypadkowego zrzutu ekranu — w porządku. Ale to nie był zrzut. To było osobiste zdjęcie, a ja właśnie wręczyłem je obcym, żeby zaoszczędzić sobie trzydziestu sekund.

To jest problem, którego postanowiłem już nie mieć. Odpowiedź okazała się taka, że to wgranie od początku nie było potrzebne.

Stary sposób: wynajmij komputer nieznajomego

Tradycyjny konwerter online działa jak usługa wysyłkowa. Wysyłasz plik w górę, na serwer. Serwer wykonuje konwersję oprogramowaniem zainstalowanym na swojej maszynie. Odsyła wynik w dół. Twój obraz odbył podróż w obie strony przez sprzęt, którego nie kontrolujesz, i gdzieś po drodze leżał, w całości, na dysku, który nie jest Twój.

Każda obietnica prywatności dokręcona do tego modelu jest obietnicą o zachowaniu — plik zostanie usunięty po godzinie, nikt nie zajrzy. Może się to sprawdzi. Może i tak. Nie masz jak sprawdzić, a powierzasz temu faktyczne bajty swojego pliku. Zaufanie jest całą architekturą, a zaufanie to dokładnie ta rzecz, której nie chciałem wydawać.

Nowy sposób: Twoja przeglądarka już ma komputer

Oto, co się zmieniło. Nowoczesne przeglądarki potrafią uruchamiać prawdziwe, skompilowane programy z prędkością bliską natywnej, dzięki czemuś, co nazywa się WebAssembly — w skrócie WASM. Kodeki obrazu, które kiedyś żyły na serwerze — kod, który czyta PNG, koduje WebP, dekoduje HEIC — można skompilować do WASM i uruchomić wewnątrz karty przeglądarki, którą już masz otwartą.

Więc gdy upuszczasz plik na stronę zbudowaną w ten sposób, oprogramowanie konwertujące pobiera się na Twoją maszynę, raz, jak każda inna część strony. Od tej chwili faktyczna praca — odczyt obrazu, transkodowanie, zapis nowego pliku — dzieje się na Twoim własnym procesorze, w Twojej własnej pamięci. Wynik zostaje oddany wprost Tobie jako pobranie. Twój plik nigdzie nie jest wysyłany, bo nie ma czego wysłać. W całej pętli nie ma serwera.

Dlatego mogę powiedzieć, że Twoje pliki nigdy nie opuszczają urządzenia, i mieć to na myśli jako fakt, nie jako politykę. Nie chodzi o to, że obiecuję nie patrzeć. Chodzi o to, że nie istnieje ścieżka, którą Twój obraz do mnie dociera. Nie mógłbym odzyskać Twojego zdjęcia, gdyby nakazał mi to sąd, bo nigdy nie było po mojej stronie kabla. Prywatność nie jest funkcją dodaną na wierzchu. Jest konsekwencją tego, gdzie działa kod.

Jak możesz sprawdzić, że to prawda

Nie musisz wierzyć mi na słowo, i to część, którą lubię najbardziej. Otwórz narzędzia deweloperskie przeglądarki, obserwuj kartę sieci i skonwertuj plik. Zobaczysz, jak strona i kodek WASM pobierają się raz. Nie zobaczysz, żeby Twój obraz szedł w górę. Jeszcze lepiej: załaduj stronę, wyłącz Wi-Fi i skonwertuj coś mimo to. Nadal działa, bo wszystko, czego potrzebuje, jest już na Twojej maszynie. Narzędzie, które wgrywa Twoje pliki, tego nie potrafi. To potrafi.

Jedno realne ograniczenie

Obiecałem uczciwość, więc oto ono. Wykonywanie konwersji na Twoim urządzeniu znaczy, że używa ona Twojej pamięci, a karta przeglądarki nie dostaje jej do zabawy w nieskończoność.

Dla normalnych plików — zdjęć, zrzutów, logotypów, tego, co ludzie konwertują cały dzień — to żaden problem. Ale jeśli rzucisz w nią czymś naprawdę ogromnym, pojedynczym obrazem w skrajnej rozdzielczości albo wielką partią naraz, możesz uderzyć w sufit. Dekodowanie obrazu znaczy trzymanie jego nieskompresowanych pikseli w pamięci, co jest znacznie większe niż plik na dysku, a gigantyczny obraz potrafi wyczerpać to, na co karta ma pozwolenie. Gdy tak się dzieje, konwersja spowalnia do ślimaczego tempa albo karta się poddaje.

Serwer z 64 GB RAM nigdy tego problemu nie ma. Oto więc wymiana, postawiona wprost: konwerter po stronie serwera przeżuje pliki większe, niż Twoje urządzenie kiedykolwiek uniesie. To podejście nie potrafi. W zamian daje Ci to, że Twój plik nigdy nie opuszcza Twoich rąk. Dla przytłaczającej większości tego, co ludzie faktycznie konwertują, to wymiana warta zawarcia bez chwili wahania. Dla rzadkiego pliku-potwora to realne ograniczenie, i wolę Ci o nim powiedzieć, niż udawać, że go nie ma.

Czemu i tak uważam to za słuszny domyślny wybór

Większość konwersji to zwykłe pliki, które od początku nie musiały tykać serwera. Wgrywanie zawsze było reliktem epoki, w której przeglądarki nie potrafiły wykonać tej pracy same. Teraz potrafią. Zdrowy domyślny wybór się więc odwrócił: trzymaj plik na swojej maszynie, wykonaj pracę lokalnie, i sięgnij po serwer tylko w rzadkim przypadku, gdy Twój własny sprzęt naprawdę nie daje rady.

Taka jest cała idea za wszystkim tutaj. To ta sama strona, którą zbudowałem dla siebie po tamtym jednym niespokojnym popołudniu, żeby już nigdy nie musieć wręczać osobistego zdjęcia nieznajomemu tylko po to, by zmienić jego rozszerzenie. Okazało się, że nigdy nie musiałem. Ty też nie.

Powiązane wpisy


Wszystkie wpisy