DEV Community на русском
Подписаться
Достижение потолка размера изображения с помощью Rust и WebAssembly
Многие инструменты для работы с изображениями предлагают ползунок качества, но государственные предписания часто требуют файлы определенного размера, что является другой проблемой. Взаимосвязь между качеством и размером файла сложна и зависит от различных свойств изображения и настроек кодировщика. Этот проект был направлен на создание конвертера HEIC с условием, что размер выходного файла должен быть меньше или равен заданному пределу байтов. Реализация в браузере использует Rust, скомпилированный в WebAssembly для эффективности. Ключевым решением при проектировании было декодирование изображения только один раз, сохраняя ограниченный объект изображения, чтобы избежать избыточных и дорогостоящих операций декодирования для предварительного просмотра, поворота и преобразования.Система определяет "точный размер" как верхний предел, что означает, что файлы будут находиться на уровне или ниже целевого размера, а не точно определенное количество байтов. Это позволяет избежать неоднозначности измерений в килобайтах в пользовательском интерфейсе, преобразуя целевой показатель в байты внутри для всех сравнений. Для преобразования JPEG алгоритм использует бинарный поиск оптимальной настройки качества в защищенном диапазоне. Этот поиск оптимизируется путем первого кодирования с минимальным качеством и, если результат слишком велик, изменения размера и повторного поиска.Если первоначальное кодирование JPEG слишком велико, система оценивает новый масштаб на основе площади изображения и применяет небольшой запас перед изменением размера с использованием высококачественного фильтра. Преобразование PNG, будучи без потерь, не имеет регулятора качества; вместо этого корректируются размеры. Это включает первоначальное уменьшение масштаба для больших фотографий, за которым следует кодирование и сравнение, а затем, возможно, фаза "увеличения" для использования большей части бюджета байтов.Преобразование в JPEG или PNG без потерь отделено от сжатия до различных целевых показателей байтов, обеспечивая четкое намерение пользователя. Информация о цвете, в частности ICC-профили, сохраняется при преобразовании и сжатии, когда это возможно. Контракт WebAssembly разработан простым, возвращая явные метаданные вместе с байтами изображения, отделяя код пользовательского интерфейса от логики сжатия. Наконец, система тестируется с реальными файлами HEIC, чтобы убедиться, что инвариант (выходные байты <= целевые байты), минимальное качество, размеры и другие метрики соблюдены, предотвращая утечку данных со страницы.