Кодирование и декодирование изображений AVIF с помощью программного обеспечения и библиотек с открытым исходным кодом


Одной из новых функций Android 12 является поддержка формата файлов AVIF, который обеспечивает файлы гораздо меньшего размера при том же уровне качества. Джейк Арчибальд проделал огромную работу по сравнению формата AVIF с JPEG, WebP и другими форматами неподвижных изображений, и результаты действительно впечатляют.

Помимо Android 12, AVIF уже поддерживается в браузере Chrome и будет включен по умолчанию в Firefox 86, но здесь мы рассмотрим некоторые программы и библиотеки с открытым исходным кодом, которые позволяют вам управлять изображениями AVIF.

С помощью библиотеки libavif, AOMedia опубликовала эталонную реализацию на C вместе с инструментами avifenc и avifdec, которые полагаются на различные кодеки, но, похоже, rav1e рекомендуется для кодирования изображения AVIF, а dav1d — лучший выбор для декодирования AVIF.

libavif не будет автоматически создавать кодек, и их необходимо включить в CMakeLists.txt

а также определить путь для выбранного кодека.

Библиотека кодирования rav1e AVIF и инструмент cavif-rs

Давайте создадим rav1e в Ubuntu 20.04:

Мы сделали это на ноутбуке AMD Ryzen, но rav1e оптимизирован как для Arm, так и для x86:

  • asm – по умолчанию включен. Когда этот параметр включен, сборка создается для поддерживающих его платформ.
    • x86_64: запрашивает nasm.
    • aarch64
      • запрашивает gas
      • Альтернатива: используйте ассемблер clang установив CC=clang

ПРИМЕЧАНИЕ. SSE2 всегда включен на x86_64, neon всегда включен для aarch64, вы можете установить для переменной среды RAV1E_CPU_TARGET значение rust, чтобы отключить все оптимизированные для сборки процедуры во время выполнения.

rav1e основан на rust, но есть также библиотека C c файлом pkg-config для людей, желающих интегрировать rav1e в свои проекты C. Его можно сгенерировать следующим образом:

rav1e предназначен для кодирования необработанных видео, и, кстати, не существует образца для кодирования файла изображения AVIF, поэтому мы можем использовать libavif или cavif-rs для создания файла AVIF из файла PNG или JPG.

Вот как можно создать cavif-rs в Ubuntu 20.04:

Обратите внимание, что он будет компилировать rav1e в процессе, поэтому не нужно заранее создавать rav1e. Теперь мы можем запустить программу, чтобы проверить ее:

На преобразование файла PNG в файл AVIF на процессоре AMD Ryzen 7 2700U потребовалось почти пять секунд, но теперь файл стал намного меньше:

Честно говоря, возможно это не оптимальный файл для формата PNG без потерь. Затем мы смогли открывать файлы в Chrome, и увидеть различия весьма сложно:

AVIF (слева) против PNG (справа)

Вы также можете проверить исходные файлы PNG и AVIF.

Библиотека декодирования dav1d AVIF и инструмент davif

Большинство встраиваемых систем, вероятно, будут использовать только декодирование/рендеринг AVIF, и для этого мы можем создать библиотеку dav1d C:

Как и rav1e, dav1d оптимизирован как для Arm, так и для x86. На момент работы кодек оптимизирован с помощью ассемблерного кода для 64-битных процессоров Arm с инструкциями NEON SIMD и чипов x86 с инструкциями AVX2 и SSSE3 + SIMD. Ведется работа над ARMv7 (32-разрядная версия) и менее распространенной архитектурой без PPC, SSE2 или AVX-512.

Затем вы можете использовать код для интеграции в свою программу, но если нам нужен пример кода, который будет декодировать/преобразовывать файл AVIF с помощью dav1d, инструмент davif  может преобразовать файл AVIF в PNG.

Вот как мы его собираем в Ubuntu 20.04:

Преобразование из AVIF в PNG происходит намного быстрее, чем наоборот, точнее, в 10 раз быстрее.

Поскольку все написано на C и ассемблере, может быть проще переносить на встраиваемые системы с ограниченными ресурсами.

Следует отметить, что AVIF — не единственный новый формат изображения, поскольку в стадии разработки так же находится формат JPEG XL, но его интеграция в веб-браузеры может занять немного больше времени. Вы найдете эталонную реализацию JPEG XL на Gitlab. Разница между AVIF и JPEG XL обсуждается на форуме encode.su  и в блоге Cloudinary , где упоминается, что AVIF предлагает лучшее сжатие, но декодер JPEG XL и особенно кодировщик должны быть быстрее и поддерживать большие разрешения, тогда как AVIF ограничен до 3840 × 2160 что кажется странным. JPEG XL не требует лицензионных отчислений, и он остается совместимым с JPEG.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments