Для кого: дизайнеры и фронтенд, которым в цепочку поставки попадает AVIF от подрядчиков, рендеров или CMS, а контракт снизу требует PNG с явным sRGB, воспроизводимой глубиной 8 бит и аудитом размера файла. Задача материала: не пересказ форматов, а рабочая матрица решений 2026: выбор декодера, таблица параметров цвета и прозрачности, пошаговый пакетный сценарий с повтором при сбоях и таблица max_bytes, привязанная к каталогам экспорта дизайна — удобно гонять ночью на удалённом Mac mini M4, не перегревая ноутбуки команды.
Содержание
Почему AVIF→PNG ломается без политики
- Глубина и тип. Десяти- или двенадцатибитный AVIF при наивном сохранении даёт широкий PNG; слоты CMS часто запрещают 16-bit.
- Цветовой объём. Теги BT.2020 или PQ в одном просмотрщике «живые», после быстрого даунгрейда в другом — «серые»; спор уходит в личные мониторы вместо лога.
- Семантика альфы. Прямая против премультиплицированной ломает кромки при наложении в CSS, отличном от превью в macOS.
- Пропускная способность и доверие. Разовые GUI-экспорты не оставляют JSONL; в июне нельзя честно переиграть апрельскую пачку на том же стеке.
Общую логику смешения WebP, AVIF и PNG сверьте с чеклистом доставки WebP, AVIF и PNG; политику sRGB и Display P3 — с чеклистом sRGB и Display P3 до первого bash-цикла.
Выбор цепочки инструментов: ffmpeg, libavif, ImageMagick
Один основной декодер на репозиторий; на воркере запретите «тихие» автообновления brew без записи в журнал партии. Прогоните три эталона — плоский UI, мягкая альфа по волосам, шумное фото — прежде чем включать параллелизм на все ядра удалённого M4.
| Инструмент | Когда уместен | Риски |
|---|---|---|
avifdec (libavif) |
Статичные кадры, жёсткая связка с релизами libaom, минимум «сюрпризов» фильтров | Нет встроенной переписи ICC — парьте с magick под политику профиля |
ffmpeg 6.1+ |
Уже есть пайплайн с -filter_complex; странные контейнеры и побочные метаданные |
Обязательно сверить -pix_fmt rgba и rgb24, иначе альфа исчезнет без сообщения |
ImageMagick 7 magick |
Единый identify и конвертация; явные PNG32 и -depth 8 |
Делегаты AVIF должны совпадать с CI; логируйте magick -list format для AVIF |
Если часть мастеров шла как WebF, а затем обернулась в AVIF, сверяйте паритет декода с матрицей WebP→PNG, чтобы QA не спорил с чужой историей кодеков.
Таблица параметров: цвет и прозрачность
| Поле контракта | Флаг или значение | Условие отказа |
|---|---|---|
| Выходная глубина | magick in.avif -depth 8 PNG32:out.png |
identify -verbose показывает 16-bit, когда в брифе закреплены восемь бит |
| Фиксация sRGB | -colorspace sRGB после декода; встроить sRGB IEC61966-2.1 или снять профиль с одной строкой в README — едино на SKU |
Встроенный Display P3 без явного разрешения продукта |
| Прямая альфа RGBA | Декод в PNG32; регрессия композита на #FFFFFF и #0B0D12 |
Ореол или серая кайма по диагонали логотипа |
| Опциональное сжатие с потерей | pngquant --quality=70-85 --speed 1 --skip-if-larger -f -o q.png lossless.png |
Полосы на коже или градиентах вне согласованного коридора качества |
Матрица: сигнал в AVIF и PNG, который можно отгрузить
| Сигнал источника | Стратегия PNG | Заметка по риску |
|---|---|---|
| Lossy AVIF, 8 bit, с тегом sRGB | Lossless-декод в PNG, затем при провале max_bytes — pngquant в записанном коридоре |
Цвет стабилен; байты часто выше, чем у AVIF — это норма, не «баг PNG» |
| HDR или кадр с PQ | По возможности пересдача из слоистого мастера; иначе один и тот же оператор тонмапа на всех воркерах, задокументированный в README | Высокий разброс Safari vs Chrome при скрытых допущениях |
| Монохромный UI-хром | Палитровый PNG только если бриф разрешает; иначе держите RGBA 8 bit | Случайная палитра ломает мягкие тени |
Пакетные шаги и повтор при сбоях
Запускайте отдельным пользователем на удалённом M4; исходники только для чтения, запись в staging/, затем атомарный mv в out/.
Шаг 1 — декод libavif
avifdec -d 8 --png-compress 2 "$src" "$tmp/${base}.png" \
|| echo "{\"file\":\"$src\",\"step\":\"avifdec\",\"ts\":\"$(date -Iseconds)\"}" >> batch_failures.jsonl
Шаг 2 — запасной путь ffmpeg
ffmpeg -hide_banner -y -i "$src" -frames:v 1 -pix_fmt rgba "${tmp}/${base}.png"
Шаг 3 — нормализация цвета и типа
magick "$tmp/${base}.png" -colorspace sRGB -depth 8 PNG32:"$work/${base}.png"
Шаг 4 — гейт по байтам
bytes=$(stat -f%z "$work/${base}.png")
test "$bytes" -le "$MAX_BYTES" || pngquant --quality=70-85 --speed 1 --skip-if-larger -f -o "$work/${base}.q.png" "$work/${base}.png"
Шаг 5 — политика повторов
Кратковременные ошибки ввода-вывода повторяйте до трёх раз с экспоненциальной паузой sleep $((2**n)); известные ошибки декодера без смены закреплённой ревизии brew не маскируйте повтором — допишите ту же строку в JSONL с кодом формулы.
Связка с каталогами дизайн-экспорта и пороги приёмки
Дублируйте структуру папок брифа буквально: design-exports/ui-lean/avif/ сопоставляйте строке таблицы lean, marketing/hero/avif/ — строке hero. CI читает короткий YAML или фрагмент shell-таблицы, чтобы дизайнеры меняли имена каталогов, а не «магические числа» в чате.
| Относительный каталог | max_bytes |
Потолок длинной стороны | Обязательные проверки |
|---|---|---|---|
ui-lean/avif |
≤ 350000 | ≤ 1600 px | PNG32 при любой альфе; встраивание sRGB по README SKU |
components/std/avif |
≤ 800000 | ≤ 2048 px | identify: тип truecolor-alpha; строка манифеста с sha256 |
marketing/hero/avif |
≤ 1600000 | ≤ 2880 px | Композит на светлом и тёмном фоне; коридор pngquant подпись лида |
out/ только если shasum -a 256 и AVIF, и PNG попали в дневной манифест — это аудит для удалённых батч-хостов.
Три опорных пункта для спецификации
- Тест lean:
test "$(stat -f%z "$png")" -le 350000для UI-капли до 350 KB. - Коридор pngquant: старт
70–85; при полосах на градиентах сузить к75–90. - Параллелизм: на воркере M4 mini держите
jobsне выше числа физических ядер минус один, чтобы троттлинг не выглядел как «случайный» провал декода.
Итог и шаг к стабильному воркеру
Матрица «источник AVIF → допустимый PNG» снимает споры, если рядом зафиксированы альфа, sRGB, max_bytes по папкам и журнал версий на удалённом M4. Откройте macpng.com, сравните тарифы и узлы, оформите аренду или покупку для ночных прогонов и загляните в помощь по SSH и VNC — без входа в аккаунт. Другие материалы — в разделе Технические идеи.
Вынесите пакетный транскод на выделенный Apple Silicon
Одинаковые флаги декодирования, JSONL по сбоям и гейты max_bytes по каталогам экспорта — пока дизайнер остаётся в Figma локально.