Questions fréquentes

Qu'est-ce que WebP ? Pourquoi l'utiliser ?

WebP est une méthode de compression avec et sans pertes qui peut être utilisée sur une grande variété d'images photographiques, translucides et graphiques disponibles sur le Web. Le degré de compression avec perte est réglable, ce qui permet à l'utilisateur de choisir le compromis entre la taille du fichier et la qualité de l'image. WebP permet généralement d'obtenir une compression moyenne de 30 % supérieure à celle de JPEG et JPEG 2000, sans perte de qualité d'image (voir étude comparative).

Le format WebP vise essentiellement à créer des images plus petites et plus esthétiques qui peuvent rendre le Web plus rapide.

Quels navigateurs Web sont compatibles avec WebP ?

Les webmasters qui souhaitent améliorer les performances de leur site peuvent facilement créer des alternatives WebP optimisées pour leurs images actuelles et les diffuser de manière ciblée aux navigateurs compatibles avec WebP.

  • Compatibilité avec le format WebP avec perte
    • Google Chrome (ordinateur) 17+
    • Google Chrome pour Android version 25 ou ultérieure
    • Microsoft Edge 18+
    • Firefox 65 ou version ultérieure
    • Opera 11.10 ou version ultérieure
    • Navigateur Web natif, Android 4.0 (ICS) ou version ultérieure
    • Safari 14+ (iOS 14+, macOS Big Sur+)
  • Prise en charge des formats WebP avec ou sans perte et du canal alpha
    • Google Chrome (ordinateur) 23 ou version ultérieure
    • Google Chrome pour Android version 25 ou ultérieure
    • Microsoft Edge 18+
    • Firefox 65 ou version ultérieure
    • Opera 12.10 ou version ultérieure
    • Navigateur Web natif, Android 4.2+ (JB-MR1)
    • Pale Moon 26 ou version ultérieure
    • Safari 14+ (iOS 14+, macOS Big Sur+)
  • Prise en charge des animations WebP
    • Google Chrome (ordinateur et Android) 32 ou version ultérieure
    • Microsoft Edge 18+
    • Firefox 65 ou version ultérieure
    • Opera 19+
    • Safari 14+ (iOS 14+, macOS Big Sur+)

Voir également :

Comment puis-je détecter la compatibilité du navigateur avec WebP ?

Vous devez diffuser des images WebP uniquement aux clients qui peuvent les afficher correctement et revenir aux anciens formats pour les clients qui ne le peuvent pas. Heureusement, il existe plusieurs techniques pour détecter la compatibilité WebP, à la fois côté client et côté serveur. Certains fournisseurs de CDN proposent la détection de la compatibilité WebP dans leur service.

Négociation de contenu côté serveur via les en-têtes Accept

Il est courant que les clients Web envoient un en-tête de requête "Accept" (Accepter), indiquant les formats de contenu qu'ils sont prêts à accepter en réponse. Si un navigateur indique à l'avance qu'il "acceptera" le format image/webp, le serveur Web sait qu'il peut envoyer des images WebP en toute sécurité, ce qui simplifie considérablement la négociation de contenu. Pour en savoir plus, consultez les liens suivants.

Modernizr

Modernizr est une bibliothèque JavaScript permettant de détecter facilement la compatibilité des navigateurs Web avec les fonctionnalités HTML5 et CSS3. Recherchez les propriétés Modernizr.webp, Modernizr.webp.lossless, Modernizr.webp.alpha et Modernizr.webp.animation.

Élément <picture> HTML5

HTML5 est compatible avec un élément <picture>, qui vous permet de lister plusieurs cibles d'image alternatives par ordre de priorité, de sorte qu'un client demande la première image candidate qu'il peut afficher correctement. Consultez cette discussion sur HTML5 Rocks. L'élément <picture> est compatible avec de plus en plus de navigateurs.

Dans votre propre code JavaScript

Une autre méthode de détection consiste à tenter de décoder une très petite image WebP qui utilise une fonctionnalité particulière, puis à vérifier si l'opération a réussi. Exemple :

// check_webp_feature:
//   'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.
//   'callback(feature, result)' will be passed back the detection result (in an asynchronous way!)
function check_webp_feature(feature, callback) {
    var kTestImages = {
        lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
        lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
        alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
        animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
    };
    var img = new Image();
    img.onload = function () {
        var result = (img.width > 0) && (img.height > 0);
        callback(feature, result);
    };
    img.onerror = function () {
        callback(feature, false);
    };
    img.src = "data:image/webp;base64," + kTestImages[feature];
}

Notez que le chargement des images est non bloquant et asynchrone. Cela signifie que tout code qui dépend de la prise en charge de WebP doit de préférence être placé dans la fonction de rappel.

Pourquoi Google a-t-il publié WebP en Open Source ?

Nous croyons fermement à l'importance du modèle Open Source. WebP étant Open Source, tout le monde peut travailler avec ce format et suggérer des améliorations. Grâce à vos commentaires et suggestions, nous pensons que le format WebP deviendra encore plus utile au fil du temps.

Comment convertir mes fichiers d'images personnelles au format WebP ?

Vous pouvez utiliser l'utilitaire de ligne de commande WebP pour convertir vos fichiers image personnels au format WebP. Pour en savoir plus, consultez Utiliser WebP.

Si vous avez de nombreuses images à convertir, vous pouvez utiliser le shell de votre plate-forme pour simplifier l'opération. Par exemple, pour convertir tous les fichiers JPEG d'un dossier, essayez la commande suivante :

Windows :

> for /R . %I in (*.jpg) do ( cwebp.exe %I -o %~fnI.webp )

Linux / macOS :

$ for F in *.jpg; do cwebp $F -o `basename ${F%.jpg}`.webp; done

Comment puis-je évaluer moi-même la qualité d'image WebP ?

Actuellement, vous pouvez afficher les fichiers WebP en les convertissant dans un format courant utilisant la compression sans perte, tel que PNG. Vous pouvez ensuite afficher les fichiers PNG dans n'importe quel navigateur ou visionneuse d'images. Pour vous faire une idée rapide de la qualité WebP, consultez la galerie de ce site pour comparer des photos côte à côte.

Comment obtenir le code source ?

Le code du convertisseur est disponible dans la section des téléchargements de la page du projet Open Source WebP. Le code du décodeur léger et la spécification VP8 sont disponibles sur le site WebM. Pour connaître les spécifications du conteneur, consultez la page Conteneur RIFF.

Quelle est la taille maximale d'une image WebP ?

WebP est compatible avec le flux binaire VP8 et utilise 14 bits pour la largeur et la hauteur. Les dimensions maximales d'une image WebP sont de 16 383 x 16 383 pixels.

Quels espaces colorimétriques sont compatibles avec le format WebP ?

Comme le flux binaire VP8, le format WebP avec perte fonctionne exclusivement avec un format d'image Y'CbCr 4:2:0 8 bits (souvent appelé YUV420). Pour en savoir plus, veuillez consulter la section 2, Format Overview (Présentation du format), du document RFC 6386, VP8 Data Format and Decoding Guide (Guide de décodage et de format de données VP8).

Le format WebP sans perte fonctionne exclusivement avec le format RGBA. Consultez la spécification du flux de bits WebP sans perte.

Pourquoi mon fichier WebP sans perte est-il différent de l'original ?

Les fonctions de l'API Simple Encoding (WebPEncodeLosslessRGB(), WebPEncodeLosslessBGR(), WebPEncodeLosslessRGBA(), WebPEncodeLosslessBGRA()) utilisent les paramètres par défaut de la bibliothèque. Pour le format sans perte, cela signifie que la qualité "exacte" est désactivée. Les valeurs RVB dans les zones entièrement transparentes (c'est-à-dire les zones dont les valeurs alpha sont égales à 0) seront modifiées pour améliorer la compression. Pour éviter cela, utilisez WebPEncode() et définissez WebPConfig::exact sur 1. Consultez la documentation de l'API Advanced Encoding.

Une image WebP peut-elle devenir plus grande que son image source ?

Oui, généralement lors de la conversion d'un format avec perte en WebP sans perte ou inversement. Cela est principalement dû à la différence d'espace colorimétrique (YUV420 par rapport à ARGB) et à la conversion entre ces deux espaces.

Voici trois situations typiques :

  1. Si l'image source est au format ARGB sans perte, le sous-échantillonnage spatial en YUV420 introduira de nouvelles couleurs plus difficiles à compresser que celles d'origine. Cette situation peut généralement se produire lorsque la source est au format PNG avec peu de couleurs : la conversion au format WebP avec pertes (ou, de même, au format JPEG avec pertes) peut entraîner une taille de fichier plus importante.
  2. Si la source est au format avec perte, l'utilisation de la compression WebP sans perte pour capturer la nature avec perte de la source entraînera généralement un fichier plus volumineux. Ce problème n'est pas spécifique à WebP et peut se produire lors de la conversion d'une source JPEG aux formats WebP ou PNG sans perte, par exemple.
  3. Si la source est au format avec perte et que vous essayez de la compresser en WebP avec perte avec un paramètre de qualité plus élevé. Par exemple, si vous essayez de convertir un fichier JPEG enregistré avec une qualité de 80 en fichier WebP avec une qualité de 95, vous obtiendrez généralement un fichier plus volumineux, même si les deux formats sont avec perte. Il est souvent impossible d'évaluer la qualité de la source. Il est donc conseillé de réduire la qualité WebP cible si la taille du fichier est systématiquement plus importante. Une autre possibilité consiste à éviter d'utiliser le paramètre de qualité et à cibler une taille de fichier donnée à l'aide de l'option -size dans l'outil cwebp ou de l'API équivalente. Par exemple, cibler 80 % de la taille du fichier d'origine peut s'avérer plus robuste.

Notez que la conversion d'une source JPEG en WebP avec pertes ou d'une source PNG en WebP sans pertes ne présente pas ce type de surprise concernant la taille du fichier.

Le format WebP est-il compatible avec l'affichage progressif ou entrelacé ?

WebP n'offre pas d'actualisation progressive ou entrelacée du décodage au sens de JPEG ou PNG. Cela risque de mettre trop de pression sur le processeur et la mémoire du client de décodage, car chaque événement d'actualisation implique un passage complet dans le système de décompression.

En moyenne, le décodage d'une image JPEG progressive équivaut à trois fois le décodage d'une image de base.

WebP propose également un décodage incrémentiel, où tous les octets entrants disponibles du flux de bits sont utilisés pour essayer de produire une ligne d'échantillon affichable le plus rapidement possible. Cela permet d'économiser de la mémoire et du processeur, et de réduire les efforts de redessinage sur le client, tout en fournissant des repères visuels sur l'état du téléchargement. La fonctionnalité de décodage incrémentiel est disponible via l'API Advanced Decoding.

Comment utiliser les liaisons Java libwebp dans mon projet Android ?

WebP inclut la prise en charge des liaisons JNI aux interfaces d'encodeur et de décodeur simples dans le répertoire swig/.

Compiler la bibliothèque dans Eclipse :

  1. Assurez-vous que le plug-in ADT est installé avec les outils NDK et que votre chemin NDK est correctement défini (Préférences > Android > NDK).
  2. Créez un projet : Fichier > Nouveau > Projet > Projet d'application Android.
  3. Clonez ou décompressez libwebp dans un dossier nommé jni dans le nouveau projet.
  4. Ajoutez swig/libwebp_java_wrap.c à la liste LOCAL_SRC_FILES.
  5. Effectuez un clic droit sur le nouveau projet, puis sélectionnez Android Tools > Add Native Support… (Outils Android > Ajouter une compatibilité native…) pour inclure la bibliothèque dans votre build.
  6. Ouvrez les propriétés du projet, puis accédez à C/C++ Build > Behaviour (Compilation C/C++ > Comportement). Ajoutez ENABLE_SHARED=1 à la section Build (Incremental build) pour compiler libwebp en tant que bibliothèque partagée.

    Remarque : En règle générale, le paramètre NDK_TOOLCHAIN_VERSION=4.8 améliore les performances de compilation 32 bits.

  7. Ajoutez swig/libwebp.jar au dossier du projet libs/.

  8. Compilez votre projet. Cela créera libs/<target-arch>/libwebp.so.

  9. Utilisez System.loadLibrary("webp") pour charger la bibliothèque au moment de l'exécution.

Notez que la bibliothèque peut être compilée manuellement avec ndk-build et le Android.mk inclus. Dans ce cas, certaines des étapes décrites ci-dessus peuvent être réutilisées.

Comment utiliser libwebp avec C#?

WebP peut être créé en tant que DLL qui exporte l'API libwebp. Ces fonctions peuvent ensuite être importées en C#.

  1. Créez libwebp.dll. Cela définira correctement WEBP_EXTERN pour exporter les fonctions de l'API.

    libwebp> nmake /f Makefile.vc CFG=release-dynamic
    
  2. Ajoutez libwebp.dll à votre projet et importez les fonctions souhaitées. Notez que si vous utilisez l'API simple, vous devez appeler WebPFree() pour libérer les tampons renvoyés.

    [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern int WebPEncodeBGRA(IntPtr rgba, int width, int height, int stride,
                                     float quality_factor, out IntPtr output);
    [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern int WebPFree(IntPtr p);
    
    void Encode() {
      Bitmap source = new Bitmap("input.png");
      BitmapData data = source.LockBits(
          new Rectangle(0, 0, source.Width, source.Height),
          ImageLockMode.ReadOnly,
          PixelFormat.Format32bppArgb);
      IntPtr webp_data;
      const int size = WebPEncodeBGRA(data.Scan0,
                                      source.Width, source.Height, data.Stride,
                                      80, out webp_data);
      // ...
      WebPFree(webp_data);
    }
    

Pourquoi utiliser le format WebP animé ?

Avantages du format WebP animé par rapport au format GIF animé

  1. WebP est compatible avec les couleurs RVB 24 bits et un canal alpha 8 bits, contrairement aux GIF qui utilisent des couleurs 8 bits et un canal alpha 1 bit.

  2. WebP est compatible avec la compression avec et sans pertes. En fait, une même animation peut combiner des frames avec et sans pertes. Le format GIF n'est compatible qu'avec la compression sans perte. Les techniques de compression avec pertes de WebP sont bien adaptées aux images animées créées à partir de vidéos du monde réel, une source d'images animées de plus en plus populaire.

  3. Le format WebP nécessite moins d'octets que le format GIF1. Les GIF animés convertis au format WebP avec pertes sont 64 % plus petits, tandis que ceux convertis au format WebP sans pertes sont 19 % plus petits. Ce point est particulièrement important sur les réseaux mobiles.

  4. WebP prend moins de temps à décoder en cas de recherche. Dans Blink, le défilement ou le changement d'onglet peuvent masquer et afficher des images, ce qui entraîne la mise en pause des animations, puis leur avance rapide vers un autre point. Une utilisation excessive du processeur entraînant une perte de frames dans les animations peut également obliger le décodeur à avancer dans l'animation. Dans ces scénarios, le temps de décodage total des images WebP animées est 0,57 fois inférieur à celui des GIF2, ce qui réduit les saccades lors du défilement et permet une récupération plus rapide après les pics d'utilisation du processeur. Cela s'explique par deux avantages de WebP par rapport à GIF :

    • Les images WebP stockent des métadonnées indiquant si chaque frame contient un canal alpha, ce qui évite d'avoir à décoder le frame pour le déterminer. Cela permet d'inférer plus précisément les frames précédents dont dépend un frame donné, ce qui réduit le décodage inutile des frames précédents.

    • Comme un encodeur vidéo moderne, l'encodeur WebP ajoute de manière heuristique des images clés à intervalles réguliers (ce que la plupart des encodeurs GIF ne font pas). Cela améliore considérablement la recherche dans les longues animations. Pour faciliter l'insertion de telles images sans augmenter considérablement la taille de l'image, WebP ajoute un indicateur de méthode de fusion pour chaque image en plus de la méthode d'élimination d'image utilisée par GIF. Cela permet à un frame clé de s'afficher comme si l'image entière avait été effacée pour laisser place à la couleur d'arrière-plan, sans forcer le frame précédent à être en taille réelle.

Inconvénients du format WebP animé par rapport au format GIF animé

  1. En l'absence de recherche, le décodage en ligne droite de WebP est plus gourmand en ressources CPU que GIF. Le format WebP avec pertes prend 2,2 fois plus de temps à décoder que le format GIF, tandis que le format WebP sans pertes prend 1,5 fois plus de temps.

  2. La prise en charge du format WebP n'est pas aussi répandue que celle du format GIF, qui est pratiquement universelle.

  3. L'ajout de la prise en charge de WebP aux navigateurs augmente l'empreinte du code et la surface d'attaque. Dans Blink, cela représente environ 1 500 lignes de code supplémentaires (y compris la bibliothèque de démultiplexage WebP et le décodeur d'images WebP côté Blink). Notez que ce problème pourrait être réduit à l'avenir si WebP et WebM partagent un code de décodage plus commun, ou si les capacités de WebP sont incluses dans celles de WebM.

Pourquoi ne pas simplement prendre en charge WebM dans <img> ?

À long terme, il peut être judicieux de prendre en charge les formats vidéo dans la balise <img>. Toutefois, le faire maintenant, avec l'intention que WebM dans <img> puisse remplir le rôle proposé pour WebP animé, pose problème :

  1. Lors du décodage d'un frame qui s'appuie sur des frames précédents, WebM nécessite 50 % de mémoire en plus que WebP animé pour contenir le nombre minimal de frames précédents3.

  2. La compatibilité avec les codecs et les conteneurs vidéo varie considérablement selon les navigateurs et les appareils. Pour faciliter le transcodage automatique du contenu (par exemple, pour les proxys permettant d'économiser de la bande passante), les navigateurs devraient ajouter des en-têtes d'acceptation indiquant les formats compatibles avec leurs balises d'image. Même cela peut être insuffisant, car les types MIME tels que "video/webm" ou "video/mpeg" n'indiquent toujours pas la prise en charge du codec (par exemple, VP8 par rapport à VP9). En revanche, le format WebP est effectivement figé. Si les fournisseurs qui l'utilisent acceptent d'envoyer des fichiers WebP animés, le comportement de WebP sur tous les UA devrait être cohérent. De plus, comme l'en-tête Accept "image/webp" est déjà utilisé pour indiquer la compatibilité avec WebP, aucune modification de l'en-tête Accept n'est nécessaire.

  3. La pile vidéo Chromium est optimisée pour une lecture fluide et suppose qu'une ou deux vidéos sont lues à la fois. Par conséquent, l'implémentation consomme beaucoup de ressources système (threads, mémoire, etc.) pour maximiser la qualité de lecture. Une telle implémentation ne s'adapte pas bien à de nombreuses vidéos simultanées et devrait être repensée pour être utilisée avec des pages Web contenant de nombreuses images.

  4. WebM n'intègre pas actuellement toutes les techniques de compression de WebP. Par conséquent, cette image se compresse beaucoup mieux avec WebP qu'avec les autres formats :


1 Pour toutes les comparaisons entre les GIF animés et les WebP animés, nous avons utilisé un corpus d'environ 7 000 images GIF animées sélectionnées au hasard sur le Web. Ces images ont été converties au format WebP animé à l'aide de l'outil "gif2webp" avec les paramètres par défaut (créés à partir de la dernière arborescence source libwebp au 08/10/2013). Les nombres comparatifs correspondent aux valeurs moyennes de ces images.

2 Les temps de décodage ont été calculés à l'aide de la dernière version de libwebp + ToT Blink au 08/10/2013 à l'aide d'un outil de benchmark. Le "Temps de décodage avec recherche" est calculé comme suit : "Décodez les cinq premières images, effacez le cache du tampon d'images, décodez les cinq images suivantes, et ainsi de suite".

3 WebM conserve quatre trames de référence YUV en mémoire, chaque trame stockant (largeur+96)*(hauteur+96) pixels. Pour YUV 4:2:0, nous avons besoin de quatre octets pour six pixels (ou 3/2 octets par pixel). Ces images de référence utilisent donc 4*3/2*(width+96)*(height+96) octets de mémoire. WebP, en revanche, n'aurait besoin que du frame précédent (en RGBA), soit 4*width*height octets de mémoire.

4 Le rendu des fichiers WebP animés nécessite Google Chrome version 32 ou ultérieure.