Заметки команды о мастерстве, форматах и небольших решениях, стоящих за хорошим результатом.
Почему фотографические PNG такие большие
Сжатие PNG без потерь хранит каждый пиксель точно. Для фотографического изображения с миллионами тонко меняющихся тонов это даёт очень большие файлы, потому что почти нечего дедуплицировать или предсказывать между соседними пикселями. Типичное фото 1600x1200 сохраняется как PNG в 3 до 5 МБ. То же изображение в JPEG при качестве 85 укладывается в 200 до 400 КБ. Этот разрыв даёт дискретное косинусное преобразование в сердце JPEG, которое работает в блоках 8x8 пикселей, отбрасывает высокочастотную детализацию, к которой зрительная система человека наименее чувствительна, и компактно кодирует оставшиеся коэффициенты. Результат, намного меньший файл для любого изображения с непрерывной тоновой вариацией, а это, по сути, любое фото. Гарантия PNG без потерь ценна для графики и рабочих файлов, но это неверный контейнер для фотографий, готовых к обмену.
Прозрачность и альфа-канал
PNG поддерживает полный 8-битный альфа-канал, то есть каждый пиксель может быть от полностью прозрачного до полностью непрозрачного. JPG не определяет никакой информации об альфе, поскольку в его контейнере нет поля для попиксельной прозрачности. Когда механизм изображений платформы пересобирает PNG в JPEG, он накладывает альфа-канал на цвет фона перед записью. Фон по умолчанию белый, поэтому прозрачные участки PNG выглядят белыми в итоговом JPG. Ключевой момент в том, что ни один инструмент не может создать прозрачный JPG, потому что формат не поддерживает такое понятие. Если сохранение выреза важно, ответ, WebP или сохранение PNG. RoundCut выбирает белый как цвет заливки, потому что он совпадает с фоном большинства документов и товарных карточек.
Замеренная производительность записи
Замерено в Chrome 148, десктоп Linux, с использованием пути записи JPEG платформы. Изображение 400x300 (0,12 МП) записывается примерно за 10 до 15 мс. Изображение 1024x768 (0,78 МП) записывается за 13 до 20 мс. Изображение 3840x2160 (8 МП) записывается примерно за 1,4 секунды. Изображение 8000x6000 (48 МП) записывается за 1,5 секунды. Запись JPEG в браузере существенно быстрее записи PNG для того же изображения и намного быстрее AVIF, которому нужен отдельный модуль и который может занять 25 секунд при 48 МП даже в десктопном Chrome. Это преимущество в скорости делает PNG в JPG одним из самых быстрых путей конвертации в этой семье, без затрат на лишнюю загрузку, потому что запись JPEG встроена в каждый браузер.
EXIF и обработка метаданных
Конвейер пересборки удаляет метаданные EXIF, IPTC и XMP из итогового JPG во всех браузерах. Это значит, что координаты местоположения, модель камеры, дата съёмки, уведомление об авторских правах и любые пользовательские поля из исходного PNG убираются. Цветовые профили ICC идут другим путём, где Chrome и Safari сохраняют профиль ICC sRGB в выводе, а Firefox удаляет его целиком. Практический итог в том, что конвертированный JPG безопасен в sRGB во всех браузерах, но если ваш PNG был помечен широкоохватным профилем вроде Display-P3 или Adobe RGB, эта метка не переживёт Firefox. Если сохранение полных метаданных, требование вашего рабочего процесса, правьте их специальным инструментом после конвертации. Для типичного веба и обмена удаление метаданных полезно, потому что чуть уменьшает файл и убирает данные GPS из фотографий.
Когда артефакты JPG заметны
Сжатие JPEG работает в блоках 8x8 пикселей. Когда исходное изображение содержит жёсткий переход между двумя очень разными цветами внутри одного блока, шаг сжатия JPEG приближает этот переход ограниченными частотными коэффициентами. Результат, звон, ореол более светлых или тёмных пикселей вокруг края. В фотографиях это незаметно, потому что края никогда не бывают идеально резкими, и реальные фото несут микровариацию, которой это приближение хорошо соответствует. В скриншотах, логотипах, элементах интерфейса с жёсткими границами, тексте или соседних плоских цветовых блоках звон ясно заметен при любой настройке качества, потому что эти элементы, именно тот сигнал, с которым алгоритм справляется плохо. Совет прост, не конвертируйте скриншоты, логотипы или насыщенные текстом изображения в JPG. Держите их как PNG или используйте WebP для меньшего файла, который полностью избегает проблемы.
Приватность на практике
Где происходит конвертация, зависит от числа файлов. Для одного изображения никакие данные не покидают браузер, и это проверяемо в реальном времени. Список остаётся пустым во время кодирования. Для двух и более файлов RoundCut отправляет их на наш сервер, который конвертирует, пакует результат и возвращает ссылку для скачивания. Эта ссылка и конвертированные файлы удаляются примерно за 2 часа. Путь для одного изображения идёт целиком на вашем устройстве, вне сети, тогда как пакетный путь меняет это на удобство конвертации многих файлов за раз. Для изображений с чувствительным содержимым, например снимка личного документа или фото с геоданными, конвертация по одному держит всё локально.