Skip to content

Pièges de Dev #1 : ton ICO a l'air correct — jusqu'à ce que tu inspectes les frames BMP

2026-06-03

Tags: Windows · Pièges de Dev


Ce n'est pas une histoire d'horreur sur la certification du Store. C'est un piège plus discret — dans lequel je suis tombé par pure curiosité.

Pendant des années, j'ai généré des fichiers .ico de la même façon paresseuse : prendre un PNG 256×256, le balancer dans un convertisseur en ligne au hasard, et récupérer le résultat. Ça avait toujours l'air correct dans l'Explorateur, alors je ne me suis jamais posé de questions.

Puis un jour, en développant un outil d'extraction ICO et en testant les fichiers ICO d'autres produits, j'ai découvert quelque chose de moche.

Ce que j'ai trouvé

Un fichier ICO est un conteneur. Il peut contenir plusieurs images à différentes tailles (16×16, 32×32, 48×48, 64×64, 128×128, 256×256) pour que Windows choisisse la bonne selon le contexte — la barre des tâches, la barre de titre, Alt+Tab, l'Explorateur de fichiers.

Dans mon fichier ICO, chaque frame avait l'air correcte à première vue. Mais en regardant de plus près :

  • La frame 256×256 (stockée en PNG) — parfaite. Canal alpha correct, bords lisses, aucun artefact.
  • Toutes les frames BMP plus petites — la transparence était complètement ratée. Le canal alpha était soit absent, soit rempli de données poubelles. Les pixels semi-transparents s'affichaient en blocs solides avec des halos de couleurs bizarres.

Les plus petites ressemblaient à un mauvais incrustation chroma key des années 90.

Pourquoi les convertisseurs en ligne faussent tout

La plupart des convertisseurs PNG vers ICO gratuits fonctionnent comme ceci :

  1. Prendre ton PNG 256×256 et le réduire à chaque taille requise (16, 32, 48, etc.)
  2. Sauvegarder la frame 256×256 en PNG
  3. Sauvegarder les petites frames en BMP 32 bits

Cependant, le format BMP dans les fichiers ICO est spécial. Il n'utilise pas le sophistiqué BITMAPV5HEADER — il utilise le BITMAPINFOHEADER standard de 40 octets, avec biBitCount défini à 32. Le 4ème octet de chaque pixel est le canal alpha. Et voici le piège : après les données de pixels de couleur (XOR mask), il doit y avoir un masque de transparence monochrome 1 bit (AND mask) pour la compatibilité héritée. De plus, biHeight dans l'en-tête doit être défini à le double de la hauteur réelle de l'image pour prendre en compte ce AND mask.

Beaucoup de convertisseurs en ligne échouent juste là :

  • Ils déclarent une couleur 32 bits mais remplissent l'octet alpha (le 4ème octet) de chaque pixel avec 0x00 (entièrement transparent) ou des données aléatoires
  • Le AND mask qu'ils génèrent est complètement désynchronisé avec les données du canal alpha

Résultat : un fichier qui a l'air valide — les entrées du répertoire sont correctes, les tailles sont bonnes, l'Explorateur ne bronche pas — mais quand Windows essaie de rendre les petites frames, le GDI blending part en vrille. Tu obtiens des halos mystérieux, des pixels transparents qui ne le sont pas vraiment, et d'autres artefacts de rendu.

Pourquoi tu ne t'en rendras pas compte avant qu'il ne soit trop tard

L'Explorateur Windows et la plupart des applications préfèrent afficher la frame PNG 256×256. Comme celle-ci est intacte, l'icône est impeccable dans toutes les vues normales — grandes icônes, boîte de dialogue des propriétés, même l'aperçu de la barre des tâches.

Les frames BMP cassées ne se manifestent que lorsque Windows doit réduire à une taille plus petite spécifique. Par exemple :

ContexteTaille utiliséeFrame concernée
Explorateur de fichiers (très grande)256×256PNG ✓
Explorateur de fichiers (grande/moyenne)48×48BMP ✗
Barre de titre / petite icône16×16BMP ✗
Sélecteur Alt+Tab32×32BMP ✗

Ainsi, l'icône de ton application peut être parfaite sur le bureau mais développer un mystérieux « halo » ou une transparence dégradée dans la barre de titre ou le sélecteur de tâches. La plupart des gens accusent le rendu de Windows. Mais non — c'est l'ICO.

Comment vérifier tes fichiers ICO

Il existe plein d'outils gratuits qui listent toutes les frames d'un fichier ICO. Vérifie :

  • Format des frames : La frame 256px devrait indiquer PNG. Les frames plus petites devraient indiquer BMP. Utiliser PNG pour toutes les frames est techniquement valide selon la spécification ICO, mais peut causer des problèmes de compatibilité sur les anciennes versions de Windows. Un mélange de PNG (256px) + BMP (tailles plus petites) est le choix le plus sûr.
  • Profondeur de bits BMP : Elle devrait être 32 BPP (32 bits par pixel) pour une véritable prise en charge du canal alpha (blend semi-transparent). Si elle indique 24 BPP, les données alpha par pixel sont perdues — la frame peut toujours se rabattre sur le AND mask 1 bit hérité de l'ICO pour un découpage basique « tout ou rien » de l'arrière-plan, mais tous les contours lissés, dégradés semi-transparents et ombres seront cassés et se transformeront en artefacts solides disgracieux ou en bordures noires épaisses sur les systèmes modernes.
  • Inspection visuelle : Charge chaque frame individuellement. Les petites frames doivent avoir un alpha lisse et correct, pas des bords irréguliers ou des arrière-plans unis.

Comment corriger le problème

Option 1 : Utiliser un éditeur d'icônes adapté et tester son convertisseur

Prends ton PNG source et crée un nouvel ICO avec un éditeur adapté qui gère correctement le canal alpha BMP. Avant de faire confiance à un convertisseur — en ligne ou hors ligne — fais un test : génère un ICO à partir d'un PNG contenant des zones semi-transparentes connues (ombres douces, dégradés, etc.), puis inspecte chaque frame. Si une frame BMP a un alpha cassé, ce convertisseur n'est pas sûr à utiliser.

Option 2 : ICO tout-PNG (quand c'est possible)

Certains outils modernes acceptent les fichiers ICO qui utilisent la compression PNG pour toutes les frames, pas seulement la 256×256. Cela évite complètement le problème d'alpha BMP. Cependant, ce n'est pas universellement supporté par toutes les versions de Windows ou toutes les applications — teste avant de t'y fier.

Points à retenir

  • Ce n'est pas parce qu'un ICO a l'air correct dans l'Explorateur qu'il l'est vraiment
  • La frame PNG 256×256 est généralement bonne ; toutes les frames BMP plus petites peuvent être cassées
  • L'alpha BMP cassé est invisible dans la plupart des vues — il ne se manifeste que dans les barres de titre, Alt+Tab et autres contextes de petites icônes
  • Teste ton convertisseur en ligne avec un PNG semi-transparent connu avant de t'y fier
  • Utilise un véritable éditeur d'icônes pour tout ce que tu distribues — ça vaut les 5 minutes

Partie de la série Pièges de Dev.