- PVSM.RU - https://www.pvsm.ru -

Lottie — новый стандарт векторной анимации

Веб-редактор creator.lottiefiles.com

Веб-редактор creator.lottiefiles.com

В области графических форматов в последнее время произошло много интересных событий. Вышла новая спецификация PNG [1] с официальным утверждением формата анимированной графики APNG, хотя его поддержка в браузерах реализована уже довольно давно.

В то же время за последние годы набрал большую популярность Lottie [2] — новый формат векторной анимации, легковесная альтернатива [3] анимированным GIF и APNG. Он основан на JSON и содержит текстовые описания элементов объектов и движений, с поддержкой растровых картинок, динамических скриптов и интерактивных элементов.


Lottie

Файлы Lottie значительно меньше по сравнению с любыми альтернативными видеоформатами или анимированной графикой. При этом векторная анимация не зависит от разрешения устройства, поэтому идеально подходит для современного веба, который работает на тысячах устройств с разными размерами экранов.

Lottie — новый стандарт векторной анимации - 2

LottieFiles [4] — крупнейший репозиторий анимаций Lottie/Bodymovin в интернете, а также центр разработки и общения для дизайнеров и разработчиков. Здесь они могут создавать, просматривать, тестировать и делиться своими анимациями.

Lottie — новый стандарт векторной анимации - 3

Немного истории

Всё началось в 2015 году, когда Эрнан Торризи (Hernan Torrisi) выпустил плагин Bodymovin для экспорта и воспроизведения анимации из Adobe After Effects в JSON-формат. Формат Lottie он назвал в честь Лотты Райнигер [5], пионера силуэтной анимации.

Другими словами, это была попытка экспорта проприетарного внутреннего формата After Effects. Действительно, открытый формат поддерживает многие его функции, хотя не все.

Вместе с плагином автор выпустил для современных браузеров рендерер с JavaScript-плеером — браузерное расширение Bodymovin [6].

В 2017 году сторонние разработчики помогли разработать библиотеки Lottie [7] под iOS, Android и React Native, что обеспечило рендеринг векторной анимации на разных платформах. Вскоре Microsoft выпустила библиотеку Lottie-Windows [8], а затем свой вклад внесли и другие крупные игроки: например, в 2019 году Samsung выпустила универсальную, платформонезависимую библиотеку rLottie [9] на С++. В том же году вышел фреймворк python-lottie [10] для работы с форматом на Python.

Lottie — новый стандарт векторной анимации - 4

Современное состояние

Сейчас Lottie — популярный формат анимации, который используется в интернете, мобильных приложениях и других системах. Для него создано множество независимых рендереров, которые отличаются по распределению рендеринга между CPU и GPU, а также по использованию памяти. Формат поддерживается в опенсорсной библиотеке ThorVG [11] и других движках векторного рендеринга.

Существующие плееры для веба:

Плееры для мобильных устройств:

SDK:

  • dotlottie-js [20] — JavaScript SDK для создания и редактирования файлов dotLottie в соответствии со спецификациями.

В 2024 году основана организация The Lottie Animation Community для помощи в стандартизации формата. Теоретически, когда-нибудь его могут утвердить в качестве всеобщего интернет-стандарта W3C и IETF.

Текущая версия спецификации v2.0 [21].

Описание формата

Пример кода, который выводит на экран 512-пиксельное изображение синего круга с чёрной окантовкой [22]:

{
    "v": "5.7.1",
    "ip": 0,
    "op": 180,
    "nm": "Animation",
    "fr": 60,
    "w": 512,
    "h": 512,
    "layers": [
        {
            "ddd": 0,
            "ty": 4,
            "ind": 0,
            "st": 0,
            "ip": 0,
            "op": 180,
            "nm": "Layer",
            "ks": {
                "a": {
                    "a": 0,
                    "k": [
                        256,
                        256
                    ]
                },
                "p": {
                    "a": 0,
                    "k": [
                        256,
                        256
                    ]
                },
                "s": {
                    "a": 0,
                    "k": [
                        100,
                        100
                    ]
                },
                "r": {
                    "a": 0,
                    "k": 0
                },
                "o": {
                    "a": 0,
                    "k": 100
                }
            },
            "shapes": [
                {
                    "ty": "el",
                    "nm": "Ellipse",
                    "d": 1,
                    "p": {
                        "a": 0,
                        "k": [
                            256,
                            256
                        ]
                    },
                    "s": {
                        "a": 0,
                        "k": [
                            256,
                            256
                        ]
                    }
                },
                {
                    "ty": "st",
                    "nm": "Stroke",
                    "o": {
                        "a": 0,
                        "k": 100
                    },
                    "c": {
                        "a": 0,
                        "k": [
                            0.114,
                            0.157,
                            0.282
                        ]
                    },
                    "lc": 2,
                    "lj": 2,
                    "ml": 0,
                    "w": {
                        "a": 0,
                        "k": 20
                    }
                },
                {
                    "ty": "fl",
                    "nm": "Fill",
                    "o": {
                        "a": 0,
                        "k": 100
                    },
                    "c": {
                        "a": 0,
                        "k": [
                            0.196,
                            0.314,
                            0.690
                        ]
                    },
                    "r": 1
                }
            ]
        }
    ]
}

Есть утилита [23] для конвертации JSON в dotLottie.

В 2020 году был представлен открытый формат dotLottie [24], объединяющий множество файлов и ресурсов Lottie (включая манифест и превьюшки) в едином контейнере, zip-архиве с deflate-сжатием. Он примерно в десять раз меньше по размеру, чем такая же анимация в формате GIF:

Lottie — новый стандарт векторной анимации - 5

Lottie может представлять графические ресурсы несколькими способами:

  • внешний файл: относительный путь к активу, хранящемуся отдельно в виде файла.

  • URI данных: строка в кодировке Base64 с двоичным файлом изображения (это значительно увеличивает размер файла).

  • URL: активы можно разместить где угодно и загружены по их URL во время выполнения.

Сжатие в единый файл zip позволяет сгруппировать все ресурсы и значительно уменьшить общий размер. Файлы dotLottie могут содержать несколько анимаций в одном файле, они распаковываются через плеер. Можно переключаться между анимациями в зависимости от действий пользователя и событий. Формат также поддерживает тематизацию (с переопределением свойств анимации на лету, включая цвета, толщину обводки, градиенты и любые анимированные свойства) и интерактивность (собственные определения конечных автоматов).

За пределами круга дизайнеров и аниматоров Lottie стал печально известен в прошлом году, когда npm-пакет lottie-player [25] был взломан [26] и использовался злоумышленниками.

Заражённые версии [27] плеера содержали код [28] для привязки криптокошелька посетителя, что потенциально позволяет посторонним лицам украсть средства с него. При посещении сайта и загрузке в браузер заражённого плеера lottie-player.js посетитель видел такое всплывающее окно:

Lottie — новый стандарт векторной анимации - 6

Как показало расследование, заражённые версии 2.0.5, 2.0.6 и 2.0.7 были опубликованы в репозиторий пакетов NPM с помощью оригинального токена автоматизации npm [29], украденного у разработчика, и даже защита 2FA не помогла в данном случае [30].

Lottie — новый стандарт векторной анимации - 7

Когда-то Flash широко использовался для внедрения эксплоитов, а сейчас для этой цели используют плееры векторной анимации, так что история в каком-то смысле повторяется.

Новые спецификации PNG

Если говорить о новых форматах изображений, то в июне 2025 года была приняты новые спецификации PNG, третья редакция [1] (Third Edition), в котором официально утверждены анимированные PNG, среди прочих изменений.

Впервые обновившись после двух десятилетий стагнации, формат PNG снова претендует на роль современного стандарта кодирования и сжатия изображений, наравне с WebP и AVIF, которые отбирают у него эти лавры.

Что добавлено в PNG [31] в 2025 году:

  • Корректная поддержка HDR (в том числе и на будущее).

На рисунке вверху показан цветовой диапазон, доступный для человеческого зрения. Маленький треугольник внутри — цветовое пространство большинства изображений. Больший внешний треугольник Rec2020 — цветовой диапазон HDR

На рисунке вверху показан цветовой диапазон, доступный для человеческого зрения. Маленький треугольник внутри — цветовое пространство большинства изображений. Больший внешний треугольник Rec2020 — цветовой диапазон HDR

По факту в PNG реализована поддержка не просто HDR, а системы кодовых точек Coding Independent Code Points [32], которая определяет параметры сигнала: цветовое пространство, функцию передачи, матричные коэффициенты и т. д. Оно используется в стандартах ITU-T H.273 и ISO/IEC 23091-2, применяется в кодеках AVC, HEVC, AVIF и др. То есть теперь PNG по этой технологии сравнялся с самыми продвинутыми кодеками.

Поддержка CICP требует всего 4 байта (плюс обычные накладные расходы PNG-блока), см. более подробное техническое описание [33].

  • APNG (анимированные PNG) добавлены в официальные спецификации. Этот формат уже давно был разработан Mozilla и поддерживался Firefox, а затем его добавили и другие программы. Теперь спецификации отразили реальность.

  • Официальная поддержка данных EXIF. Заголовки EXIF в файле содержат дополнительную информацию о документе, такую как данные о копирайте (автор фотографии), параметры съёмки: название камеры, параметры объектива, выдержка и диафрагма, GPS-координаты съёмки и др.

После двух десятилетий относительного застоя сейчас работа над спецификациями PNG возобновилась с новой силой. Рабочая группа PNG [34] с участием Adobe, Apple, BBC, Comcast/NBCUniversal, Google, MovieLabs и W3C, то есть всех крупных игроков, трудится над созданием двух новых версий спецификаций. Речь идёт о четвёртой и пятой редакциях. В небольшом четвёртом апдейте планируют улучшить совместимость между HDR и SDR, а в пятом будут уже серьёзные изменения по сжатию изображений.

Новая версия PNG поддерживается в последних версиях всех браузеров, Photoshop и другом ПО.

Сжатие без потерь c float-каналами

Если сравнивать [35] различные кодеки и форматы для сжатия без потерь в форматах хранения значений с плавающей точкой (float), то в здесь отлично проявляет себя формат OpenEXR [36]. В нём недавно добавили новый режим сжатия HTJ2k, который базируется на алгоритмах High-Throughput JPEG 2000 [37].

В таких форматах значения пикселей хранятся не в целочисленном формате, а в формате чисел с плавающей точкой (обычно 16-bit или 32-bit float). Это даёт гораздо больше точности и диапазона для представления цвета и яркости. Формат лучше подходит для кодирования изображений типа HDR с широким динамическим диапазоном. Он также уменьшает количество округлений и потерь при обработке фильтрами и цветокоррекции. Поэтому OpenEXR широко применяется в кинематографе, научной визуализации, медицинской графике, профессиональной графике и 3D-рендеринге.

Тестирование кодеков для сжатия изображений floating point

Тестирование кодеков для сжатия изображений floating point

В результатах тестов [35] OpenEXR-HTJ2k обеспечивает чуть лучшее сжатие, чем OpenEXR-ZIP, но пока есть проблемы с производительностью. Ещё более серьёзные проблемы со скоростью сжатия у JPEG-XL (libjxl). При этом совершенно неожиданно великолепные результаты по скорости и компрессии показала опенсорсная библиотека Mesh Optimizer [38] от Арсения Капулкина, которая вообще предназначена не для сжатия изображений, а для оптимизации рендеринга. Но оказалось, что и со сжатием она отлично справляется (в последовательной цепочке с zstd).

Напомним, что в PNG сжатие без потерь обеспечивает компрессор ZIP, так что его результаты должны быть примерно сопоставимы с OpenEXR-ZIP.

И ещё интересный момент: в случае сжатия без потерь можно последовательно объединять в цепочку несколько кодеков, это улучшит коэффициент сжатия.


В общем, форматы изображений продолжают совершенствоваться. Специалисты возобновили работу над старым PNG. В то же время приятно видеть и появление принципиально новых форматов, таких как Lottie, и эффективное применение в специализированных областях посторонних инструментов, как Mesh Optimizer.

В векторной анимации с Lottie теоретически может конкурировать SVG, который поддерживает анимацию через JavaScript [39], но это чуть более сложный формат, хотя кому-то он может показаться более нативным. Например, вот анимация красного круга, который за восемь секунд перемещается по экрану слева направо с остановкой в конце:

<svg width="100%" height="100" xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="50" style="fill:red;">
    <animate
      attributeName="cx"
      begin="0s"
      dur="8s"
      from="50"
      to="90%"
      fill="freeze" />
  </circle>
</svg>

Но анимации Lottie создаются в современных графических редакторах уровня After Effects (+плагин Bodymovin), с поддержкой сложных эффектов, чего у SVG нет.

© 2025 ООО «МТ ФИНАНС»

Автор: alizar

Источник [40]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/png/429149

Ссылки в тексте:

[1] новая спецификация PNG: https://www.w3.org/TR/png-3/

[2] Lottie: https://lottie.github.io/

[3] легковесная альтернатива: https://lottiefiles.com/what-is-lottie

[4] LottieFiles: https://lottiefiles.com/

[5] Лотты Райнигер: https://en.wikipedia.org/wiki/Lotte_Reiniger

[6] Bodymovin: https://github.com/bodymovin/bodymovin-extension

[7] библиотеки Lottie: https://airbnb.io/lottie/#/

[8] Lottie-Windows: https://github.com/CommunityToolkit/Lottie-Windows

[9] rLottie: https://www.youtube.com/watch?v=Q2c7Hj_Sa1o

[10] python-lottie: https://gitlab.com/mattbas/python-lottie/-/blob/master/CHANGELOG.md

[11] ThorVG: https://www.thorvg.org/

[12] dotlottie-web: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-web

[13] dotlottie-wc: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-wc

[14] dotlottie-react: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-react

[15] dotlottie-vue: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-vue

[16] dotlottie-svelte: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-svelte

[17] dotlottie-android: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-android

[18] dotlottie-ios: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-ios

[19] dotlottie-react-native: https://developers.lottiefiles.com/docs/dotlottie-player/dotlottie-react-native

[20] dotlottie-js: https://developers.lottiefiles.com/docs/tools/dotlottie-js/

[21] v2.0: https://dotlottie.io/spec/#v2-0

[22] синего круга с чёрной окантовкой: https://en.wikipedia.org/wiki/File:Lottie_basic_example.png

[23] утилита: https://lottiefiles.com/tools/lottie-to-dotlottie

[24] dotLottie: https://dotlottie.io/intro/

[25] lottie-player: https://www.npmjs.com/package/@lottiefiles/lottie-player

[26] взломан: https://thehackernews.com/2024/10/lottiefiles-issues-warning-about.html

[27] Заражённые версии: https://github.com/LottieFiles/lottie-player/issues/254

[28] содержали код: https://forum.lottiefiles.com/t/the-problem-of-someone-elses-popup-appearing/6470

[29] токена автоматизации npm: https://github.blog/changelog/2020-10-02-npm-automation-tokens/

[30] не помогла в данном случае: https://checkmarx.com/blog/with-2fa-enabled-npm-package-lottie-player-taken-over-by-attackers/

[31] Что добавлено в PNG: https://www.programmax.net/articles/png-is-back/

[32] Coding Independent Code Points: https://www.w3.org/TR/png-3/#cICP-chunk

[33] подробное техническое описание: https://svgees.us/blog/cICP.html

[34] Рабочая группа PNG: https://www.w3.org/groups/wg/png/participants/

[35] сравнивать: https://aras-p.info/blog/2025/07/08/Lossless-Float-Image-Compression/

[36] OpenEXR: https://en.wikipedia.org/wiki/OpenEXR

[37] High-Throughput JPEG 2000: https://jpeg.org/jpeg2000/htj2k.html

[38] Mesh Optimizer: https://github.com/zeux/meshoptimizer

[39] поддерживает анимацию через JavaScript: https://www.w3schools.com/graphics/svg_animation.asp

[40] Источник: https://habr.com/ru/companies/ruvds/articles/938958/?utm_source=habrahabr&utm_medium=rss&utm_campaign=938958