Как я написал свой формат сжатия фотографий UISES на чистом JavaScript
Всем привет! Меня зовут Гордей, и я разработчик-энтузиаст. Сегодня хочу рассказать про свой пет-проект — экспериментальный формат хранения изображений под названием UISES. Идея возникла спонтанно: а что, если взять обычную фотографию и перевести каждый её пиксель в чистый бинарный код — ноль или единицу? А затем попробовать сжать эту последовательность так, чтобы файл занимал меньше места. Так родился UISES. Название расшифровывается с языка зулу: «ukucindezelwa kwesisindo isithombe», что переводится как «сжатие веса изображения». Архитектура формата: смотрим на байты. Я не стал изобретать сложную структуру и сделал фиксированный 32-байтовый заголовок, за которым сразу идут данные. Первые 4 байта — это магия «UISE». Она нужна, чтобы программа могла отличить наш файл от любого другого (например, от JPEG или PNG). Далее идут версия формата, размер заголовка, ширина и высота картинки. Поле «Каналы» указывает, что мы работаем с чёрно-белым изображением (1 канал), а поле «Глубина цвета» — что на каждый пиксель отводится всего 1 бит. В конце заголовка лежит контрольная сумма CRC32, которую я пока оставил нулевой (в планах — дописать). Как работает сжатие (RLE). Алгоритм RLE (Run-Length Encoding) идеально подходит для работы с битами. Когда мы переводим пиксели в биты, у нас получается длинная строка, например: 1 0 0 0 0 0 1 1 1 0 1. RLE-сжатие превращает её в пары «количество-значение»: 1 1, 5 0, 3 1, 1 0, 1 1. Мы записываем эти пары в виде байтов. Если на фотографии много неба, стен или однотонных участков, файл сжимается в разы. Если же фотография — это сплошной шум (трава, листва, мелкие детали), файл может весить столько же, сколько исходное изображение в сыром виде. Конвертер в браузере. Чтобы не заставлять пользователей что-то устанавливать, я сделал конвертер прямо в браузере. Вся работа происходит через Canvas API: вы загружаете фото (или делаете снимок через камеру), скрипт переводит пиксели в биты, прогоняет через RLE и собирает бинарный файл. Вес файла рассчитывается динамически ещё до скачивания. Бонусом я добавил вывод «байтового кода» прямо на экран — можно посмотреть, как выглядит фото на уровне компьютера. Открытие файлов на Windows (только для Windows!). Отдельная боль — заставить файлы .uises открываться двойным кликом. Браузер не может прописать ассоциацию файлов в системе, поэтому я сделал установщик в виде bat-скрипта. При запуске он создаёт папку в AppData, копирует туда просмотрщик и прописывает в реестр команду для открытия файлов .uises. Обратите внимание: установщик написан исключительно для Windows. На телефонах (Android или iOS), а также на Linux и macOS он работать не будет. Важное примечание: конвертер я тестировал на смартфоне. До компьютера я пока не добрался, поэтому работу установщика на Windows вживую проверить не успел. Если заметите баги — пишите в комментариях! Что дальше? Сейчас формат сохраняет фото в чёрно-белом виде (1 бит на пиксель). В планах — добавить поддержку цвета, дописать подсчёт CRC32 и поддержку метаданных (EXIF). Проект полностью некоммерческий. Попробовать конвертер можно здесь: https://uises.hixo.dev/
https://s.fotora.ru/4a1d079eb5b8f57a.webp
Ссылка на логотип.