shadcn.io— тысячи готовых блоков shadcn/ui
Перейти к содержимому

Как на самом деле работает конвертация картинок в браузере (и почему я так её сделал)

Весь этот сайт существует из-за маленькой глупой неловкости, которую я испытал много лет назад. Мне нужно было сконвертировать одно фото HEIC в JPG, я вбил в поиск очевидное и попал на конвертер, который хотел, чтобы я загрузил свой снимок к нему на сервер. Я загрузил. Сработало. А потом сидел и думал: этот снимок теперь лежит на какой-то машине, о которой я ничего не знаю, у людей, которых никогда не встречу, хранится столько, сколько мне никто не сказал. Для случайного скриншота — ладно. Но это был не скриншот. Это была личная фотография, и я только что вручил её незнакомцам, чтобы сэкономить себе тридцать секунд.

Вот эту проблему я и решил больше не иметь. Ответ оказался в том, что загрузка вообще никогда не была нужна.

Старый путь: арендовать чужой компьютер

Обычный онлайн-конвертер работает как служба доставки по почте. Вы отправляете файл наверх, на сервер. Сервер выполняет конвертацию софтом, установленным на его машине. Он присылает результат обратно вниз. Ваша картинка совершила круговую поездку через железо, которое вы не контролируете, и где-то посередине целиком полежала на диске, который вам не принадлежит.

Любое обещание приватности, прикрученное к этой модели, — обещание о поведении: файл удалится через час, никто не смотрит. Может, так и есть. Может быть. Проверить вы никак не можете и доверяете этому реальные байты своего файла. Доверие тут и есть вся архитектура — а именно доверием мне и не хотелось расплачиваться.

Новый путь: у вашего браузера уже есть компьютер

Вот что изменилось. Современные браузеры способны выполнять настоящие скомпилированные программы почти на скорости железа через штуку под названием WebAssembly — сокращённо WASM. Кодеки изображений, что раньше жили на сервере, — код, читающий PNG, кодирующий WebP, декодирующий HEIC, — можно скомпилировать в WASM и запустить внутри уже открытой у вас вкладки браузера.

Так что когда вы бросаете файл на страницу, устроенную подобным образом, софт конвертации скачивается к вам на машину — один раз, как любая другая часть веб-страницы. Дальше вся собственно работа — чтение вашей картинки, перекодирование, запись нового файла — идёт на вашем собственном процессоре, в вашей собственной памяти. Результат отдаётся прямо вам на скачивание. Ваш файл никуда не отправляется, потому что и отправлять некуда. Сервера в цепочке нет вовсе.

Потому я и могу сказать, что ваши файлы не покидают устройство, и подразумевать это как факт, а не как политику. Дело не в том, что я обещаю не смотреть. Дело в том, что нет пути, которым ваша картинка ко мне попала бы. Я не смог бы достать вашу фотографию, даже если бы суд приказал, — потому что её никогда не было на моей стороне провода. Приватность — не функция, которую я приделал сверху. Это следствие того, где выполняется код.

Как убедиться, что это правда

Верить мне на слово не нужно, и это часть, которая мне нравится больше всего. Откройте инструменты разработчика в браузере, следите за вкладкой «Сеть» и сконвертируйте файл. Вы увидите, как один раз скачиваются страница и WASM-кодек. Вы не увидите, чтобы ваша картинка уходила наверх. Ещё лучше: загрузите страницу, отключите Wi-Fi и всё равно сконвертируйте что-нибудь. Оно по-прежнему работает, потому что всё нужное уже на вашей машине. Инструмент, который загружает ваши файлы, так не может. Этот может.

Единственное реальное ограничение

Я обещал честность, так вот она. Выполнение конвертации на вашем устройстве означает, что она использует вашу же память, а вкладка браузера не получает бесконечную память для игр.

Для обычных файлов — фотографий, скриншотов, логотипов, всего, что люди конвертируют изо дня в день, — это не проблема вовсе. Но если бросить в неё что-то по-настоящему исполинское, одну картинку экстремального разрешения или огромный пакет разом, можно упереться в потолок. Декодирование картинки означает удержание её несжатых пикселей в памяти, а это куда больше файла на диске, и гигантское изображение способно исчерпать то, что вкладке дозволено. Когда так случается, конвертация замедляется до ползка или вкладка сдаётся.

У сервера с 64 ГБ оперативной памяти такой беды нет никогда. Так что вот сделка, названная прямо: серверный конвертер способен прожевать файлы больше, чем ваше устройство вообще потянуло бы. Этот подход — нет. Взамен он даёт то, что ваш файл не покидает ваших рук. Для подавляющего большинства того, что люди реально конвертируют, это сделка, на которую стоит идти не задумываясь. Для редкого файла-монстра это настоящий предел, и я лучше скажу вам о нём, чем сделаю вид, что его нет.

Почему я всё же считаю это правильным вариантом по умолчанию

Большинство конвертаций — обычные файлы, которым и не нужно было касаться сервера с самого начала. Загрузка всегда была пережитком эпохи, когда браузеры не умели делать эту работу сами. Теперь умеют. Так что здравый вариант по умолчанию перевернулся: держите файл на своей машине, делайте работу локально и тянитесь к серверу лишь в тех редких случаях, когда ваше железо и правда не справляется.

В этом и вся идея всего, что здесь есть. Это тот же сайт, что я собрал для себя после того одного тревожного вечера, чтобы больше никогда не вручать личное фото незнакомцу лишь ради смены расширения файла. Оказалось, мне это и не требовалось. И вам тоже.

Похожие статьи


Все статьи