Les designers et front reçoivent de l’AVIF alors que le brief exige du PNG sRVB huit bits avec plafonds octets. Cette matrice 2026 fixe la chaîne d’outils, un tableau couleur / alpha, un lot avec retry et des seuils par dossier d’export pour un Mac mini M4 distant nocturne.
Sommaire
Frictions : AVIF entrant, PNG sortant, contrat absent
- Profondeur surprise. Un master dix ou douze bits impose un pipeline explicite ; beaucoup de CMS refusent le PNG 16 bits.
- Dérive d’espace. BT.2020 ou PQ se lit bien dans un lecteur et s’aplatit ailleurs après conversion naïve.
- Sémantique alpha. Alpha droite contre prémultipliée casse les logos sur fonds clair ou sombre.
- Débit et confiance. Sans JSONL ni versions d’outils figées, l’ops ne peut pas rejouer le lot d’avril en juin.
Alignez formats avec la checklist WebP / AVIF vs PNG et la couleur avec la checklist sRVB vs Display P3 avant toute boucle dossier.
Chaîne d’outils : comparatif ffmpeg, libavif et ImageMagick sur Apple Silicon
Un décodeur principal par dépôt ; pas de brew upgrade sur le worker sans relecture ; trois fichiers or avant d’augmenter le parallélisme.
| Outil | Préférer quand | Points de vigilance |
|---|---|---|
avifdec (libavif) |
Images fixes, lien serré aux releases libaom, peu de surprises de filtre | Pas de réécriture ICC intégrée ; enchaîner magick pour la politique de profil |
ffmpeg 6.1+ |
Pipelines déjà riches en -filter_complex ; métadonnées atypiques |
Vérifier -pix_fmt rgba contre rgb24 sous peine de perdre l’alpha |
ImageMagick 7 magick |
Même binaire pour identify et conversion ; PNG32 et -depth 8 explicites |
Aligner les versions sur la CI ; journaliser magick -list format pour AVIF |
Historique WebP ? Croisez avec la matrice WebP → PNG.
Couleur et transparence : tableau de paramètres
| Champ du contrat | Drapeau ou valeur recommandé | Condition d’échec |
|---|---|---|
| Profondeur de sortie | magick entree.avif -depth 8 PNG32:sortie.png |
identify -verbose affiche 16-bit alors que le brief impose huit bits |
| Verrou sRVB | -colorspace sRGB après décodage ; embarquer sRGB IEC61966-2.1 ou retirer l’ICC avec une ligne README — une seule règle par SKU |
Profil Display P3 embarqué sans validation produit |
| Alpha droite RGBA | Décoder en PNG32 ; régression visuelle sur #FFFFFF et #0B0D12 |
Halos ou franges grises sur diagonales de logo |
| Repli avec perte | pngquant --quality=70-85 --speed 1 --skip-if-larger -f -o q.png sansperte.png |
Banding sur dépassement de la plage qualité signée |
Matrice : signaux dans l’AVIF source versus PNG livrable
| Signal source | Stratégie PNG | Risque |
|---|---|---|
| AVIF avec perte, huit bits, balisé sRVB | Décoder en PNG sans perte puis pngquant optionnel si max_bytes échoue |
Faible sur la couleur ; volume souvent supérieur à l’AVIF |
| Encore HDR ou PQ | Repartir du master feuilleté si possible ; sinon opérateur de tone-map identique sur chaque worker | Élevé entre Safari et Chrome sans contrat écrit |
| Chrome UI monochrome | PNG palette seulement si le brief l’autorise ; sinon RGBA huit bits | Moyen : palette accidentelle casse les ombres douces |
Script de lot, échecs et retry sur Mac M4 distant
Utilisateur dédié, sources RO, écriture staging/ puis mv vers out/. Même discipline pngquant / zopflipng que sur vos autres lots PNG.
Étape 1 — Décodage libavif
avifdec -d 8 --png-compress 2 "$src" "$tmp/${base}.png" \
|| echo "{\"fichier\":\"$src\",\"etape\":\"avifdec\",\"ts\":\"$(date -Iseconds)\"}" >> echecs_lot.jsonl
Étape 2 — Variante ffmpeg
ffmpeg -hide_banner -y -i "$src" -frames:v 1 -pix_fmt rgba "${tmp}/${base}.png"
Étape 3 — Typage couleur
magick "$tmp/${base}.png" -colorspace sRGB -depth 8 PNG32:"$work/${base}.png"
Étape 4 — Portillon octets
octets=$(stat -f%z "$work/${base}.png")
test "$octets" -le "$MAX_OCTETS" || pngquant --quality=70-85 --speed 1 --skip-if-larger -f -o "$work/${base}.q.png" "$work/${base}.png"
Étape 5 — Politique de retry
Trois tentatives E/S avec sleep $((2**n)) ; erreurs décodeur = bump Homebrew + même ligne JSONL.
Dossiers d’export design et seuils d’acceptation
Miroir strict des remises : ui-lean/avif → ligne lean, marketing/hero/avif → hero. Tableau YAML ou shell lu par le manifeste — pas de constantes dans Slack.
| Dossier relatif d’export | max_bytes |
Grand côté max | Contrôles requis |
|---|---|---|---|
ui-lean/avif |
≤ 350000 | ≤ 1600 px | PNG32 si alpha ; ICC sRVB selon README SKU |
components/std/avif |
≤ 800000 | ≤ 2048 px | Type truecolor-alpha via identify ; ligne sha256 dans le manifeste |
marketing/hero/avif |
≤ 1600000 | ≤ 2880 px | Composition sur fonds clair et sombre ; plage pngquant signée par le lead si repli |
shasum -a 256 source et PNG figurent au manifeste — audit batch distant.
Seuils citables pour tickets et README
- Test lean :
test "$(stat -f%z "$png")" -le 350000pour les drops UI compacts. - Plage pngquant : défaut
70–85; resserrer vers75–90si banding visible sur portraits. - Parallélisme : plafonner
jobsà cœurs physiques moins un sur Mac mini M4 afin que la thermique ne passe pas pour des décodages « aléatoires ».
Passer à l’action : MacPng pour sweeps AVIF nocturnes
Ouvrez l’accueil MacPng, comparez les forfaits et nœuds, passez par location ou achat lorsque vous avez besoin d’hôtes Apple Silicon dédiés, et consultez l’aide SSH/VNC pour monter le worker. Poursuivez sur le blog pour des matrices adjacentes.
Livrer du PNG contractuel sans faire fondre les portables
Figez les piles de décodage, streamez les échecs en JSONL et appliquez des max_bytes par dossier pendant que l’équipe design reste sur Figma en local.