Что такое WebP? Зачем его использовать?
WebP — это метод сжатия с потерями и без потерь, который может применяться к широкому спектру фотографических, полупрозрачных и графических изображений, доступных в интернете. Степень сжатия с потерями регулируется, что позволяет пользователю найти компромисс между размером файла и качеством изображения. WebP обычно обеспечивает в среднем на 30% более эффективное сжатие, чем JPEG и JPEG 2000, без потери качества изображения (см. Сравнительное исследование ).
Формат WebP по сути направлен на создание более мелких и красивых изображений, которые могут помочь ускорить работу Интернета.
Какие веб-браузеры изначально поддерживают WebP?
Веб-мастера, заинтересованные в улучшении производительности сайта, могут легко создать оптимизированные альтернативы WebP для своих текущих изображений и предоставлять их целенаправленно браузерам, поддерживающим WebP.
- Поддержка WebP с потерями
- Google Chrome (для ПК) 17+
- Google Chrome для Android версии 25+
- Microsoft Edge 18+
- Firefox 65+
- Опера 11.10+
- Собственный веб-браузер, Android 4.0+ (ICS)
- Safari 14+ (iOS 14+, macOS Big Sur+)
- Поддержка WebP с потерями, без потерь и альфа-кодирования
- Google Chrome (для ПК) 23+
- Google Chrome для Android версии 25+
- Microsoft Edge 18+
- Firefox 65+
- Опера 12.10+
- Собственный веб-браузер, Android 4.2+ (JB-MR1)
- Бледная Луна 26+
- Safari 14+ (iOS 14+, macOS Big Sur+)
- Поддержка анимации WebP
- Google Chrome (для ПК и Android) 32+
- Microsoft Edge 18+
- Firefox 65+
- Опера 19+
- Safari 14+ (iOS 14+, macOS Big Sur+)
Смотрите также:
Как определить, поддерживает ли браузер формат WebP?
Изображения в формате WebP следует показывать только тем клиентам, которые могут корректно отображать их, а для клиентов, которые не могут, использовать устаревшие форматы. К счастью, существует несколько методов определения поддержки WebP как на стороне клиента, так и на стороне сервера. Некоторые поставщики CDN предлагают определение поддержки WebP в рамках своих услуг.
Согласование содержимого на стороне сервера через заголовки Accept
Веб-клиенты часто отправляют заголовок запроса «Accept», указывающий, какие форматы контента они готовы принимать в ответ. Если браузер заранее указывает, что он «примет» формат image/webp , веб-сервер понимает, что может безопасно отправлять изображения WebP, что значительно упрощает согласование контента. Подробнее см. по следующим ссылкам.
- Развертывание новых форматов изображений в Интернете
- Показ изображений WebP посетителям с использованием элементов HTML
Модернизр
Modernizr — это библиотека JavaScript для удобного определения поддержки HTML5 и CSS3 в веб-браузерах. Обратите внимание на свойства Modernizr.webp , Modernizr.webp.lossless , Modernizr.webp.alpha и Modernizr.webp.animation .
HTML5 элемент <picture>
HTML5 поддерживает элемент <picture>
, который позволяет перечислить несколько альтернативных целевых изображений в порядке приоритета, так что клиент запросит первое подходящее изображение, которое он сможет отобразить корректно. См. это обсуждение на HTML5 Rocks . Поддержка элемента <picture>
постоянно растёт во всём диапазоне браузеров .
В вашем собственном JavaScript
Другой метод обнаружения — попытка декодировать очень маленькое изображение WebP, использующее определённый элемент, и проверить успешность. Пример:
// check_webp_feature:
// 'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.
// 'callback(feature, result)' will be passed back the detection result (in an asynchronous way!)
function check_webp_feature(feature, callback) {
var kTestImages = {
lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
};
var img = new Image();
img.onload = function () {
var result = (img.width > 0) && (img.height > 0);
callback(feature, result);
};
img.onerror = function () {
callback(feature, false);
};
img.src = "data:image/webp;base64," + kTestImages[feature];
}
Обратите внимание, что загрузка изображений происходит неблокируемо и асинхронно. Это означает, что любой код, зависящий от поддержки WebP, желательно помещать в функцию обратного вызова.
Почему Google выпустила WebP с открытым исходным кодом?
Мы глубоко верим в важность модели с открытым исходным кодом. Благодаря открытому исходному коду WebP любой желающий может работать с этим форматом и предлагать улучшения. Мы уверены, что благодаря вашему вкладу и предложениям WebP со временем станет ещё более полезным графическим форматом.
Как мне конвертировать мои личные файлы изображений в формат WebP?
Вы можете использовать утилиту командной строки WebP для преобразования ваших персональных изображений в формат WebP. Подробнее см. в разделе «Использование WebP» .
Если вам нужно преобразовать много изображений, вы можете использовать оболочку вашей платформы для упрощения процесса. Например, чтобы преобразовать все JPEG-файлы в папке, попробуйте следующее:
Окна:
> for /R . %I in (*.jpg) do ( cwebp.exe %I -o %~fnI.webp )
Linux/macOS:
$ for F in *.jpg; do cwebp $F -o `basename ${F%.jpg}`.webp; done
Как я могу самостоятельно оценить качество изображения WebP?
В настоящее время файлы WebP можно просматривать, конвертируя их в распространённый формат со сжатием без потерь, например, PNG, а затем просматривать их в любом браузере или программе просмотра изображений. Чтобы получить представление о качестве WebP, посетите Галерею на этом сайте для сравнения фотографий.
Как получить исходный код?
Код конвертера доступен в разделе загрузок на странице проекта WebP с открытым исходным кодом. Код облегчённого декодера и спецификация VP8 доступны на сайте WebM . Спецификацию контейнера см. на странице RIFF Container .
Каков максимальный размер изображения WebP?
Формат WebP совместим с VP8 по битстриму и использует 14 бит для ширины и высоты. Максимальный размер изображения WebP в пикселях составляет 16383 x 16383.
Какие цветовые пространства поддерживает формат WebP?
В соответствии с битовым потоком VP8, формат WebP с потерями работает исключительно с 8-битным форматом изображений Y'CbCr 4:2:0 (часто называемым YUV420). Подробнее см. в разделе 2 « Обзор формата » документа RFC 6386 «Руководство по формату данных и декодированию VP8 ».
Формат WebP без потерь работает исключительно с форматом RGBA. См. спецификацию WebP Lossless Bitstream .
Почему мой файл WebP без потерь отличается от оригинала?
Функции API простого кодирования ( WebPEncodeLosslessRGB()
, WebPEncodeLosslessBGR()
, WebPEncodeLosslessRGBA()
, WebPEncodeLosslessBGRA()
) используют настройки библиотеки по умолчанию. Для сжатия без потерь это означает, что параметр «exact» отключен. Значения RGB в полностью прозрачных областях (то есть областях со значениями альфа, равными 0
) будут изменены для улучшения сжатия. Чтобы избежать этого, используйте WebPEncode()
и установите WebPConfig::exact
значение 1
См. документацию по API расширенного кодирования .
Может ли изображение WebP стать больше исходного изображения?
Да, обычно при конвертации из формата с потерями в WebP без потерь и наоборот. Это в основном связано с разницей в цветовых пространствах (YUV420 и ARGB) и особенностями преобразования между ними.
Вот три типичные ситуации:
- Если исходное изображение имеет формат ARGB без потерь, то пространственная понижающая дискретизация до YUV420 приведёт к появлению новых цветов, которые сложнее сжать, чем исходные. Такая ситуация обычно возникает, когда исходное изображение имеет формат PNG с небольшим количеством цветов: преобразование в WebP с потерями (или, аналогично, в JPEG с потерями) потенциально приведёт к увеличению размера файла.
- Если исходный файл находится в формате с потерями, использование сжатия WebP без потерь для сохранения свойств исходного файла обычно приводит к увеличению размера файла. Это не является особенностью WebP и может произойти, например, при конвертации исходного файла JPEG в форматы WebP без потерь или PNG.
- Если исходный файл находится в формате с потерями, и вы пытаетесь сжать его в WebP с потерями и более высоким качеством. Например, попытка конвертировать файл JPEG, сохранённый с качеством 80, в файл WebP с качеством 95 обычно приводит к увеличению размера файла, даже если оба формата с потерями. Оценка качества исходного файла часто невозможна, поэтому рекомендуется снизить целевое качество WebP, если размер файла постоянно больше. Другой вариант — не использовать настройки качества и вместо этого задать целевой размер файла с помощью параметра
-size
в инструментеcwebp
или аналогичном API. Например, целевой размер файла, равный 80%, может оказаться более надёжным.
Обратите внимание, что преобразование исходного файла JPEG в файл WebP с потерями или исходного файла PNG в файл WebP без потерь не приводит к таким сюрпризам с размером файла.
Поддерживает ли WebP прогрессивное или чересстрочное отображение?
WebP не поддерживает прогрессивное или чересстрочное обновление декодирования, как JPEG или PNG. Это, вероятно, создаст слишком большую нагрузку на процессор и память декодирующего клиента, поскольку каждое обновление подразумевает полный проход через систему декомпрессии.
В среднем декодирование прогрессивного изображения JPEG эквивалентно декодированию базового изображения 3 раза.
В качестве альтернативы, WebP предлагает инкрементальное декодирование, при котором все доступные входящие байты битового потока используются для скорейшего создания отображаемой строки сэмпла. Это экономит память, ресурсы процессора и время на перерисовку на стороне клиента, а также предоставляет визуальные подсказки о состоянии загрузки. Функция инкрементального декодирования доступна через API Advanced Decoding .
Как использовать привязки Java libwebp в моем Android-проекте?
WebP включает поддержку привязок JNI к простым интерфейсам кодировщика и декодера в каталоге swig/
.
Сборка библиотеки в Eclipse :
- Убедитесь, что у вас установлен плагин ADT вместе с инструментами NDK и правильно указан путь к NDK ( Настройки > Android > NDK ).
- Создайте новый проект: Файл > Новый > Проект > Проект приложения Android .
- Клонируйте или распакуйте libwebp в папку с именем
jni
в новом проекте. - Добавьте
swig/libwebp_java_wrap.c
в списокLOCAL_SRC_FILES
. - Щелкните правой кнопкой мыши по новому проекту и выберите «Инструменты Android» > «Добавить собственную поддержку...», чтобы включить библиотеку в сборку.
Откройте свойства проекта и перейдите в раздел «Сборка C/C++» > «Поведение» . Добавьте
ENABLE_SHARED=1
в разделBuild (Incremental build)
чтобы собрать libwebp как общую библиотеку.Примечание. Установка
NDK_TOOLCHAIN_VERSION=4.8
в целом улучшит производительность 32-битной сборки.Добавьте
swig/libwebp.jar
в папку проектаlibs/
.Соберите свой проект. Будет создан
libs/<target-arch>/libwebp.so
.Используйте
System.loadLibrary("webp")
для загрузки библиотеки во время выполнения.
Обратите внимание, что библиотеку можно собрать вручную с помощью ndk-build
и входящего в комплект Android.mk
. В этом случае некоторые из описанных выше шагов можно использовать повторно.
Как использовать libwebp с C#?
WebP можно собрать как DLL-библиотеку, экспортирующую API libwebp. Эти функции затем можно импортировать в C#.
Соберите libwebp.dll. Это позволит правильно настроить WEBP_EXTERN для экспорта функций API.
libwebp> nmake /f Makefile.vc CFG=release-dynamic
Добавьте libwebp.dll в свой проект и импортируйте необходимые функции. Обратите внимание: если вы используете простой API, необходимо вызвать функцию
WebPFree()
для освобождения всех возвращаемых буферов.[DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)] static extern int WebPEncodeBGRA(IntPtr rgba, int width, int height, int stride, float quality_factor, out IntPtr output); [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)] static extern int WebPFree(IntPtr p); void Encode() { Bitmap source = new Bitmap("input.png"); BitmapData data = source.LockBits( new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr webp_data; const int size = WebPEncodeBGRA(data.Scan0, source.Width, source.Height, data.Stride, 80, out webp_data); // ... WebPFree(webp_data); }
Почему мне следует использовать анимированный WebP?
Преимущества анимированного WebP по сравнению с анимированным GIF
WebP поддерживает 24-битный цвет RGB с 8-битным альфа-каналом, в то время как GIF поддерживает 8-битный цвет и 1-битный альфа-канал.
WebP поддерживает сжатие как с потерями, так и без потерь; фактически, одна анимация может сочетать кадры как с потерями, так и без потерь. GIF поддерживает только сжатие без потерь. Методы сжатия с потерями в WebP хорошо подходят для анимированных изображений, созданных на основе реальных видеороликов, которые становятся всё более популярным источником анимированных изображений.
Формат WebP требует меньше байтов, чем GIF 1 . Анимированные GIF-файлы, преобразованные в WebP с потерями, на 64% компактнее, а WebP без потерь — на 19%. Это особенно важно в мобильных сетях.
WebP-изображение декодируется быстрее при наличии перемотки. В Blink прокрутка или смена вкладок может скрывать и показывать изображения, что приводит к приостановке анимации и последующему переходу к другой точке. Чрезмерная загрузка процессора, приводящая к пропуску кадров в анимации, также может потребовать от декодера перемотки анимации. В этих сценариях анимированный WebP-изображение занимает в 0,57 раза меньше времени декодирования2 , чем GIF-изображение, что приводит к меньшим подтормаживаниям при прокрутке и более быстрому восстановлению после пиков загрузки процессора. Это обусловлено двумя преимуществами WebP перед GIF:
Изображения WebP хранят метаданные о наличии альфа-канала в каждом кадре, устраняя необходимость декодирования кадра для определения этого. Это позволяет более точно определить, от каких предыдущих кадров зависит данный кадр, тем самым сокращая ненужное декодирование предыдущих кадров.
Подобно современному видеокодеру, кодер WebP эвристически добавляет ключевые кадры через регулярные интервалы (чего большинство кодеров GIF не делают). Это значительно ускоряет поиск в длинных анимациях. Чтобы упростить вставку таких кадров без значительного увеличения размера изображения, WebP добавляет флаг «метода смешивания» для каждого кадра в дополнение к методу удаления кадров, используемому в GIF. Это позволяет отрисовывать ключевой кадр так, как будто всё изображение было очищено до фонового цвета, без принудительного изменения предыдущего кадра на полноразмерный.
Недостатки анимированного WebP по сравнению с анимированным GIF
При отсутствии поиска прямолинейное декодирование WebP требует больше ресурсов процессора, чем GIF. WebP с потерями данных декодируется в 2,2 раза быстрее, чем GIF, а WebP без потерь — в 1,5 раза быстрее.
Поддержка WebP не так распространена, как поддержка GIF, которая фактически универсальна.
Добавление поддержки WebP в браузеры увеличивает объём кода и поверхность атаки. В Blink это примерно 1500 дополнительных строк кода (включая библиотеку демультиплексирования WebP и декодер изображений WebP на стороне Blink). Обратите внимание, что эта проблема может быть решена в будущем, если WebP и WebM будут использовать более общий код декодирования или если возможности WebP будут интегрированы в WebM.
Почему бы просто не поддержать WebM в <img>
?
Поддержка видеоформатов внутри тега <img>
может иметь смысл в долгосрочной перспективе. Однако делать это сейчас, с учётом того, что WebM в <img>
может заменить анимированный WebP, проблематично:
При декодировании кадра, который зависит от предыдущих кадров, WebM требует на 50% больше памяти, чем анимированный WebP, для хранения минимального количества предыдущих кадров 3 .
Поддержка видеокодеков и контейнеров сильно различается в зависимости от браузера и устройства. Для обеспечения автоматического перекодирования контента (например, для прокси-серверов, экономящих полосу пропускания) браузерам потребуется добавить заголовки принятия, указывающие, какие форматы поддерживают их теги изображений. Даже этого может быть недостаточно, поскольку MIME-типы, такие как «video/webm» или «video/mpeg», по-прежнему не указывают на поддержку кодека (например, VP8 вместо VP9). С другой стороны, формат WebP фактически заморожен, и если поставщики соглашаются поставлять анимированный WebP, поведение WebP во всех пользовательских агентах должно быть согласованным; а поскольку заголовок принятия «image/webp» уже используется для указания поддержки WebP, никаких новых изменений в заголовках принятия не требуется.
Видеостек Chromium оптимизирован для плавного воспроизведения и предполагает, что одновременно воспроизводится только одно или два видео. В результате реализация активно использует системные ресурсы (потоки, память и т. д.) для достижения максимального качества воспроизведения. Такая реализация плохо масштабируется для одновременного воспроизведения большого количества видео и требует переработки для использования на веб-страницах с большим количеством изображений.
В настоящее время WebM не поддерживает все методы сжатия WebP. В результате это изображение сжимается в WebP значительно лучше, чем альтернативные форматы:
1 Для всех сравнений анимированных GIF-файлов и анимированных WebP-файлов мы использовали корпус из примерно 7000 анимированных GIF-изображений, случайно выбранных из интернета. Эти изображения были преобразованы в анимированный WebP-файл с помощью инструмента gif2webp с настройками по умолчанию (созданного на основе последней версии исходного кода libwebp по состоянию на 08.10.2013). Сравнительные значения представляют собой средние значения для этих изображений.
2 Время декодирования было рассчитано с использованием последней версии libwebp + ToT Blink по состоянию на 10.08.2013 с использованием инструмента для тестирования производительности . «Время декодирования с поиском» рассчитывается следующим образом: «Декодирование первых пяти кадров, очистка кэша буфера кадров, декодирование следующих пяти кадров и т. д.».
3 WebM хранит в памяти 4 опорных кадра YUV, каждый из которых хранит (ширина + 96) * (высота + 96) пикселей. Для YUV 4:2:0 требуется 4 байта на 6 пикселей (или 3/2 байта на пиксель). Таким образом, эти опорные кадры занимают 4*3/2*(width+96)*(height+96)
байт памяти. WebP же, с другой стороны, потребуется только предыдущий кадр (в RGBA), что составляет 4*width*height
байта памяти.
4 Для рендеринга анимированного WebP требуется Google Chrome версии 32+.