Заметки команды о мастерстве, форматах и небольших решениях, стоящих за хорошим результатом.
Контейнер без потерь, что хранит PNG
PNG опирается на алгоритм сжатия без потерь DEFLATE. Он хранит значения RGBA каждого пикселя ровно такими, как получены, применяет обратимый фильтр к каждой строке развёртки, и сжимает результат вариантом zlib. Без потерь означает, что распакованные значения пикселей побайтово идентичны исходным. В случае JPG в PNG исходными являются пиксели, которые получаются, когда браузер декодирует JPEG. Эти декодированные пиксели уже отражают все приближения, сделанные JPEG при исходном кодировании, поэтому PNG честно хранит приближённые пиксели, а не реальную сцену. По измерениям JPEG в 17 КБ при 1024x768 декодируется примерно в 105 КБ как PNG, а JPEG в 116 КБ при 3840x2160 вырастает примерно до 384 КБ. Эти множители держатся примерно одинаково для разных типов содержимого, потому что соотношение зависит от разрешения, а не от уровня качества JPEG. Контейнер без потерь ценен тем, что предотвращает, дальнейшую деградацию, а не тем, что восстанавливает.
Почему качество JPEG нельзя восстановить
Сжатие JPEG отбрасывает информацию безвозвратно. Процесс кодирования применяет дискретное косинусное преобразование к блокам 8x8 пикселей, квантует полученные частотные коэффициенты до меньшего набора, и хранит эти квантованные значения. Шаг квантования односторонний, ведь коэффициент, который был 47 и округлился до 50, потом нельзя вернуть к 47, и запись об исходном значении в файле не сохраняется. Когда браузер декодирует JPEG, он восстанавливает пиксели из квантованных коэффициентов, которые являются приближениями исходных значений. Пересборка этих приближённых пикселей как PNG даёт запись приближений без потерь, поэтому PNG является точным представлением деградировавшего изображения. Это не ограничение PNG или этого инструмента, это фундаментальное свойство сжатия с потерями, где отброшенная при кодировании информация исчезает. Чтобы улучшить качество JPEG, нужно начинать с несжатого оригинала или RAW.
Измеренный рост размера файла
Соотношение размеров от JPG к PNG зависит от содержимого изображения, но следует предсказуемой закономерности. Фотографические изображения со сложными тональными переходами растут сильнее всего, потому что преобразование JPEG настроено именно на такое содержимое и достигает высоких степеней сжатия, тогда как сжатие PNG без потерь не может сравниться с этими степенями на шумных пиксельных данных. Тестовые измерения этого инструмента показывают, что фотография JPEG в 17 КБ при 1024x768 даёт PNG в 105 КБ, примерно шестикратный рост, а фотография JPEG в 116 КБ при 3840x2160 даёт PNG в 384 КБ, примерно в 3,3 раза больше. Для плоских по цвету изображений вроде скриншотов и значков JPEG изначально плохо подходит содержимому, и его файлы обычно крупнее при равном качестве, поэтому PNG того же содержимого растёт менее резко. Практический вывод прямой, если размер выходного файла важен для вашей задачи, преобразование JPG в PNG делает ситуацию хуже, а не лучше.
Прозрачность, возможность против содержимого
PNG поддерживает 8-битный прозрачность как возможность контейнера, где файл может включать значения непрозрачности по каждому пикселю в диапазоне от 0 (полностью прозрачный) до 255 (полностью непрозрачный). Когда JPG преобразуется в PNG пересборкой через встроенный движок изображений платформы, итоговый PNG становится полностью непрозрачным, с каждым пикселем при значении альфа 255, потому что у исходного JPG вообще не было информации о прозрачности. Формат PNG готов хранить прозрачность, файл просто не содержит её, потому что её не было в источнике. Добавление прозрачности к изображению требует отдельной обработки, либо маскирования фона в редакторе, либо автоматического шага удаления фона. Инструмент удаления фона, обученный распознавать объект, может выдать PNG с настоящей альфой, обнулив значения альфа на пикселях фона после преобразования.
Обработка метаданных EXIF
Конвейер пересборки убирает метаданные EXIF, IPTC и XMP из PNG на выходе во всех браузерах. Это значит, что координаты GPS, модель камеры, дата съёмки, строки авторских прав и любые пользовательские поля XMP, имевшиеся в исходном JPG, удаляются. Цветовые профили ICC идут немного иным путём, где Chrome и Safari сохраняют метку профиля ICC sRGB на выходе, а Firefox убирает её вместе со всеми прочими метаданными. Практический итог это вывод, безопасный по sRGB, во всех браузерах, но широкоохватные профили вроде Display-P3 или Adobe RGB теряются в Firefox. Для большинства задач веба и обмена удаление метаданных полезно, ведь оно слегка уменьшает размер вывода и убирает данные о местоположении из фотографий. Для профессиональной фотографии или архивных процессов, где встроенные метаданные нужно сохранять, ведите цепочку метаданных специальным инструментом до или после преобразования формата.
Приватность на практике
Где происходит конвертация, зависит от числа файлов. Для одного изображения никакие данные не покидают браузер, и это проверяемо в реальном времени. Сеть остаётся неактивной во время одной конвертации. Список остаётся пустым во время кодирования. Для двух и более файлов RoundCut отправляет их на наш сервер, который конвертирует, пакует результат и возвращает ссылку для скачивания. Эта ссылка и конвертированные файлы удаляются примерно за 2 часа. Путь для одного изображения идёт целиком на вашем устройстве, вне сети, тогда как пакетный путь меняет это на удобство конвертации многих файлов за раз. Для изображений с чувствительным содержимым, например снимка личного документа или фото с геоданными, конвертация по одному держит всё локально.