Hoe afbeeldingen omzetten in de browser echt werkt (en waarom ik het zo bouwde)
Dov Azencot
@DovAzencotDe reden dat deze hele site bestaat is een klein, dom moment van onbehagen dat ik jaren geleden had. Ik moest één HEIC-foto naar JPG omzetten, ik typte het voor de hand liggende in een zoekbalk, en ik belandde op een converter die wilde dat ik mijn foto naar hun server uploadde. Dus dat deed ik. Het werkte. En toen zat ik daar te denken: die foto staat nu op een of andere machine waar ik niets van weet, gerund door mensen die ik nooit zal ontmoeten, bewaard voor een tijdsduur die me nooit is verteld. Voor een willekeurige schermafbeelding, prima. Maar het was geen schermafbeelding. Het was een persoonlijke foto, en ik had hem net aan vreemden gegeven om mezelf dertig seconden te besparen.
Dat is het probleem dat ik voortaan niet meer wilde hebben. Het antwoord bleek te zijn dat de upload om te beginnen nooit nodig was.
De oude manier: de computer van een vreemde huren
Een traditionele online converter werkt als een postorderdienst. Je stuurt je bestand omhoog naar een server. De server voert de omzetting uit met software die op zijn machine is geïnstalleerd. Hij stuurt het resultaat weer omlaag. Je afbeelding maakte een rondreis door hardware die je niet in de hand hebt, en ergens in het midden stond hij, volledig, op een schijf die niet van jou is.
Elke privacybelofte die op dat model wordt geschroefd, is een belofte over gedrag — het bestand wordt na een uur verwijderd, niemand kijkt. Misschien klopt dat. Misschien wel. Je hebt geen manier om het te controleren, en je vertrouwt het de daadwerkelijke bytes van je bestand toe. Het vertrouwen ís de hele architectuur, en vertrouwen was precies het ding dat ik niet wilde uitgeven.
De nieuwe manier: je browser heeft de computer al
Dit is wat er veranderde. Moderne browsers kunnen echte, gecompileerde programma's draaien op bijna-native snelheid, via iets dat WebAssembly heet — WASM in het kort. De beeldcodecs die vroeger op een server leefden — de code die een PNG leest, die een WebP encodeert, die HEIC decodeert — kunnen worden gecompileerd naar WASM en draaien binnen het browsertabblad dat je al open hebt.
Dus als je een bestand op een pagina zet die zo is gebouwd, downloadt de omzetsoftware één keer naar je machine, zoals elk ander deel van de webpagina. Vanaf dan gebeurt het eigenlijke werk — je afbeelding lezen, transcoderen, het nieuwe bestand schrijven — op je eigen processor, in je eigen geheugen. Het resultaat wordt je rechtstreeks als download aangereikt. Je bestand wordt nooit ergens heen gestuurd, want er is niets om het naartoe te sturen. Er zit helemaal geen server in de keten.
Daarom kan ik zeggen dat je bestanden je apparaat nooit verlaten en het als feit bedoelen in plaats van als beleid. Het is niet dat ik beloof niet te kijken. Het is dat er geen route is waarlangs je afbeelding mij bereikt. Ik zou je foto niet kunnen ophalen al beval een rechter het me, want hij stond nooit aan mijn kant van de lijn. De privacy is geen functie die ik erbovenop heb gezet. Het is een gevolg van waar de code draait.
Hoe je kunt zien dat het klopt
Je hoeft me niet op mijn woord te geloven, en dat is het deel dat ik het leukst vind. Open de ontwikkelaarstools van je browser, houd het netwerktabblad in de gaten, en zet een bestand om. Je ziet de pagina en de WASM-codec één keer downloaden. Je ziet je afbeelding niet omhooggaan. Nog beter: laad de pagina, zet je wifi uit, en zet toch iets om. Het werkt nog steeds, want alles wat het nodig heeft staat al op je machine. Een tool die je bestanden uploadt kan dat niet. Deze wel.
De ene echte beperking
Ik beloofde eerlijkheid, dus hier is hij. De omzetting op je eigen apparaat draaien betekent dat het je eigen geheugen gebruikt, en een browsertabblad krijgt geen oneindig geheugen om mee te spelen.
Voor normale bestanden — foto's, schermafbeeldingen, logo's, het spul dat mensen de hele dag omzetten — is dit geen punt. Maar gooi je er iets werkelijk enorms tegenaan, één afbeelding op extreme resolutie, of een grote batch in één keer, dan kun je tegen het plafond aanlopen. Een afbeelding decoderen betekent zijn ongecomprimeerde pixels in geheugen houden, wat veel groter is dan het bestand op schijf, en een gigantische afbeelding kan uitputten wat het tabblad is toegestaan. Als dat gebeurt kruipt de omzetting tot stilstand of geeft het tabblad het op.
Een server met 64 GB RAM heeft dat probleem nooit. Dus daar is de ruil, ronduit gesteld: een converter aan de serverkant kan door bestanden heen kauwen die groter zijn dan je apparaat ooit aankan. Deze aanpak niet. Wat je er in ruil voor krijgt is dat je bestand je handen nooit verlaat. Voor de overgrote meerderheid van wat mensen daadwerkelijk omzetten, is dat een ruil die de moeite waard is zonder er twee keer over na te denken. Voor een zeldzaam monsterbestand is het een echte beperking, en ik vertel het je liever dan het weg te doen alsof.
Waarom ik het toch de juiste standaard vind
De meeste omzettingen zijn gewone bestanden die om te beginnen nooit een server hoefden aan te raken. De upload was altijd al een overblijfsel uit een tijd waarin browsers dit werk niet zelf konden doen. Nu kunnen ze het wel. Dus de verstandige standaard klapte om: houd het bestand op je machine, doe het werk lokaal, en grijp alleen naar een server bij de zeldzame gelegenheid dat je eigen hardware het echt niet aankan.
Dat is het hele idee achter alles hier. Het is dezelfde site die ik voor mezelf bouwde na die ene onrustige middag, zodat ik nooit meer een persoonlijke foto aan een vreemde hoefde te geven alleen om de bestandsextensie te veranderen. Bleek dat ik dat nooit had gehoeven. Jij ook niet.
Gerelateerde artikelen
Waarom ik PNG naar WebP converteer (en die ene keer niet)
PNG is een schitterend formaat om in te werken en een verkwistend om uit te leveren. Dit is wat WebP je echt bespaart, waar het niets oplevert, en de ene regel die ik nooit breek.
PNG of JPG? De vuistregel die ik al tien jaar gebruik
Lossless tegenover lossy, randen tegenover foto's, transparantie tegenover niets. Eén simpele vraag vertelt je welk formaat een bestand hoort te zijn — met een echte groottetabel als bewijs.
Waarom je iPhone-foto's HEIC zijn (en wanneer JPG beter is)
HEIC is echt een beter formaat dat de helft van het web nog steeds niet kan openen. Waarom Apple ervoor koos, wat je inlevert als je naar JPG omzet, en wanneer ik het niet doe.
Alle artikelen