Préparer ses images pour le web
Formats, dimensions, poids et texte alternatif, avec le travail répétitif délégué à un agent.
Les images sont presque toujours le premier poste de poids d'une page. Pas le JavaScript, pas les polices : la photo de couverture exportée à 4000 pixels de large parce que c'est ce que la banque d'images proposait, affichée dans un bloc de 800 pixels.
Le travail à faire est répétitif et bien défini : recadrer, redimensionner, convertir, nommer, écrire un texte alternatif. C'est exactement le genre de tâche qu'on délègue, à condition d'avoir décidé les règles avant.
Ce guide pose ces règles, puis montre comment faire exécuter le reste.
Avant de commencer
- Un dossier d'images sources, en pleine résolution
- Node.js, pour la conversion par lot
- La liste des emplacements où ces images seront affichées, avec leur largeur
1Partir de la largeur d'affichage, pas de la source
La question n'est jamais « quelle taille fait mon image », mais « quelle largeur occupe-t-elle à l'écran, au maximum ».
Mesure-la :
Ouvre [URL]. Pour chaque image de la page, rends-moi un tableau : source,
largeur affichee en px, largeur intrinseque du fichier, poids du fichier.
Signale celles dont la largeur intrinseque depasse le double de la largeur
affichee.
La règle de dimensionnement tient en une ligne : le fichier doit faire environ deux fois la largeur d'affichage maximale, pour couvrir les écrans à haute densité. Au-delà, tu payes des pixels que personne ne voit.
| Emplacement | Largeur d'affichage | Fichier à produire |
|---|---|---|
| Vignette de liste | 300 px | 600 px |
| Image d'article | 800 px | 1600 px |
| Bandeau pleine largeur | 1440 px | 2880 px |
2Choisir le format
| Format | Pour quoi |
|---|---|
| SVG | Logos, icônes, schémas. Vectoriel, net à toute taille, souvent le plus léger |
| WebP | Le choix par défaut pour les photos et les visuels complexes |
| AVIF | Compression meilleure que WebP, encodage plus lent |
| PNG | Uniquement si tu as besoin de transparence sans perte, ou d'une capture nette de texte |
| JPEG | Repli pour les navigateurs très anciens |
La documentation de Next.js donne un ordre de grandeur utile : l'AVIF prend
généralement environ 50 % de temps d'encodage en plus que le WebP, pour un
poids environ 20 % inférieur. C'est aussi pour ça que la valeur par défaut de
l'option formats du composant Image est ['image/webp'], l'AVIF devant être
activé explicitement.
Ne convertis pas un SVG en image matricielle
Un logo exporté en PNG à 2000 px pèse cent fois son équivalent SVG et reste flou au zoom. Si tu as le fichier vectoriel, garde le vectoriel.
3Traiter par lot
La bibliothèque sharp fait le travail en quelques lignes. Ses méthodes de
sortie sont toFile, toBuffer et toUint8Array, et les formats s'appellent
par leur nom : webp(), avif(), jpeg(), png().
npm install sharp
import { readdir } from "node:fs/promises";
import path from "node:path";
import sharp from "sharp";
const source = "./images-sources";
const sortie = "./public/images";
const largeurs = [600, 1200, 1800];
for (const fichier of await readdir(source)) {
const nom = path.parse(fichier).name;
for (const largeur of largeurs) {
await sharp(path.join(source, fichier))
.resize({ width: largeur })
.webp({ quality: 80 })
.toFile(path.join(sortie, `${nom}-${largeur}.webp`));
}
}
Sur la qualité : sharp documente le paramètre quality comme un entier de 1 à
100, avec 80 par défaut pour le JPEG et le WebP, et 50 pour l'AVIF. Descendre
sous 70 se voit sur les aplats et les dégradés ; monter au-dessus de 85 ne
gagne presque rien de visible et alourdit nettement.
Regarde le résultat
La compression se juge à l'œil, pas au chiffre. Ouvre l'original et la version compressée côte à côte, en taille réelle, avant de valider un réglage pour tout un lot. Les visages et les ciels dégradés sont les premiers à souffrir.
4Poser les attributs qui comptent
Quatre attributs de l'élément img, et un cinquième conditionnel.
widthetheight: les dimensions intrinsèques. Elles réservent la place avant le chargement et évitent que la page saute pendant qu'elle se charge.loading="lazy": diffère le chargement jusqu'à l'approche de la zone visible. Les valeurs sontlazyeteager,eagerétant la valeur par défaut.srcsetetsizes: la liste des variantes disponibles et la largeur qu'occupera l'image selon la mise en page, pour que le navigateur choisisse le bon fichier.alt: toujours présent.
<img
src="/images/atelier-1200.webp"
srcset="/images/atelier-600.webp 600w,
/images/atelier-1200.webp 1200w,
/images/atelier-1800.webp 1800w"
sizes="(max-width: 768px) 100vw, 800px"
width="1200"
height="800"
loading="lazy"
alt="Deux personnes devant un ecran, en train de relire du code"
/>
L'image en haut de page ne se charge pas en différé
Mettre loading="lazy" sur l'image principale visible au chargement la
retarde au lieu de l'accélérer. Réserve le chargement différé à ce qui est
sous la ligne de flottaison.
5Écrire les textes alternatifs
C'est la partie où un agent aide beaucoup et décide mal. Il produit vite une description correcte du contenu visuel, mais il ne connaît pas le rôle de l'image dans ta page.
Trois cas, trois réponses :
- L'image porte de l'information. Décris ce qui compte, dans le contexte. Pour une photo de produit : la matière et la couleur, pas « photo de produit ».
- L'image est décorative. Mets
alt="". C'est un attribut vide, présent : il indique explicitement au lecteur d'écran de passer. Un attributaltabsent est un autre problème, l'outil lit alors souvent le nom du fichier. - L'image est aussi un lien ou un bouton. Le texte alternatif décrit la destination, pas l'image. Pour un logo qui ramène à l'accueil : « Accueil », pas « Logo de l'entreprise ».
Pour chaque image de [DOSSIER], propose un texte alternatif en francais,
de moins de 125 caracteres, decrivant ce qui est visible sans commencer par
« image de » ou « photo de ». Rends-moi un tableau fichier / proposition.
Je relirai chaque ligne.
La dernière phrase n'est pas de la politesse. Une description plausible mais fausse est pire qu'une description absente, parce qu'elle est invérifiable par la personne qui l'entend.
Le contrôle final
Ouvre [URL]. Liste les images par poids decroissant, avec leur largeur
affichee, leur largeur intrinseque, leur format et la valeur de leur
attribut loading. Signale : celles sans width et height, celles sans alt,
celles chargees en differe alors qu'elles sont visibles au chargement.
Quelques prompts pour aller plus loin
| Objectif | Prompt à adapter |
|---|---|
| Audit de poids | Classe les images de [URL] par poids et dis-moi lesquelles sont surdimensionnees par rapport a leur affichage. |
| Conversion par lot | Ecris un script sharp qui produit, pour chaque image de [DOSSIER], des versions WebP en [LARGEURS] px avec une qualite de 80. |
| Textes alternatifs | Propose un alt de moins de 125 caracteres pour chaque image de [DOSSIER]. Tableau fichier / proposition. |
| Nommage | Renomme les fichiers de [DOSSIER] en minuscules, sans accent ni espace, en gardant un nom descriptif. Liste l'ancien et le nouveau nom avant d'agir. |
| Décalage de mise en page | Ouvre [URL] et liste les images sans width et height, avec leur selecteur. |
Tu as d’autres ressources comme ça ?
Ce que tu viens de lire est entièrement gratuit. Une nouvelle ressource part chaque semaine dans la newsletter : guides, modèles à copier et liens triés, sans compte à créer.
Me contacter
Une question, un projet, une envie de collaborer ? Écris-moi.
Cette page est en accès libre, n’hésite pas à la partager.