Dev-Fallen #1: Deine ICO sieht gut aus — bis du die BMP-Frames prüfst
2026-06-03
Tags: Windows · Dev-Fallen
Das hier ist keine dieser Store-Zertifizierungs-Horrorgeschichten. Es ist eine eher unscheinbare Falle — in die ich ganz einfach aus purer Neugier getappt bin.
Jahrelang habe ich .ico-Dateien auf die immer gleiche bequeme Art erstellt: ein 256×256-PNG hernehmen, in irgendeinen beliebigen Online-Konverter werfen, das Ergebnis runterladen. Im Explorer sah es immer richtig aus, also habe ich mir nie Gedanken gemacht.
Bis ich eines Tages beim Entwickeln eines ICO-Unpacking-Tools die ICO-Dateien anderer Produkte getestet habe — und etwas Hässliches entdeckte.
Was ich gefunden habe
Eine ICO-Datei ist ein Container. Sie kann mehrere Bilder in verschiedenen Groessen enthalten (16×16, 32×32, 48×48, 64×64, 128×128, 256×256), sodass Windows je nach Kontext das passende auswaehlen kann — Taskleiste, Titelleiste, Alt+Tab, Datei-Explorer.
In meiner ICO-Datei sah jeder einzelne Frame auf den ersten Blick einwandfrei aus. Aber bei genauerer Betrachtung:
- Der 256×256-Frame (als PNG gespeichert) — perfekt. Korrekter Alphakanal, weiche Kanten, keine Artefakte.
- Jeder kleinere BMP-Frame — die Transparenz war komplett hinueber. Der Alphakanal fehlte entweder ganz oder enthielt Muell. Halbtransparente Pixel wurden zu festen Bloeckern mit seltsamen Farbsaeumen.
Die kleineren sahen aus wie ein schlechter Chroma-Key aus den 90ern.
Warum Online-Konverter das vermasseln
Die meisten kostenlosen PNG-zu-ICO-Konverter arbeiten nach diesem Schema:
- Das 256×256-PNG nehmen und auf jede benoetigte Groesse herunterskalieren (16, 32, 48, usw.)
- Den 256×256-Frame als PNG speichern
- Die kleineren Frames als 32-Bit-BMP speichern
Das BMP-Format in ICO-Dateien ist jedoch besonders. Es verwendet nicht den ausgefeilten BITMAPV5HEADER, sondern den standardmaessigen 40-Byte-BITMAPINFOHEADER mit biBitCount auf 32. Das 4. Byte jedes Pixels ist der Alphakanal. Und hier kommt der Haken: Nach den Farb-Pixeldaten (XOR mask) muss eine 1-Bit-monochrome Transparenzmaske (AND mask) fuer die Abwaertskompatibilitaet vorhanden sein. Zudem muss biHeight im Header auf das Doppelte der tatsaechlichen Bildhoehe gesetzt werden, um diese AND mask zu beruecksichtigen.
Viele Online-Konverter scheitern genau hier:
- Sie deklarieren 32-Bit-Farbe, fuellen aber jedes Alpha-Byte (das 4. Byte) jedes Pixels mit
0x00(vollstaendig transparent) oder zufaelligen Muell-Daten - Die generierte AND mask ist voellig ausser Takt mit den Alpha-Kanal-Daten
Das Ergebnis: eine Datei, die gueltig aussieht — die Verzeichniseintraege stimmen, die Groessen passen, der Explorer meckert nicht — aber wenn Windows versucht, die kleineren Frames zu rendern, geraten die GDI blending durcheinander. Man bekommt mysterioese Halos, transparente Pixel, die gar nicht transparent sind, und andere Rendering-Artefakte.
Warum dir das erst auffaellt, wenn es zu spaet ist
Der Windows Explorer und die meisten Anwendungen bevorzugen den 256×256-PNG-Frame zur Anzeige. Da dieser unangetastet ist, sieht das Symbol in jeder normalen Ansicht einwandfrei aus — grosse Symbole, Eigenschaften-Dialog, selbst die Taskleisten-Vorschau.
Die kaputten BMP-Frames kommen nur dann zum Vorschein, wenn Windows auf eine bestimmte kleinere Groesse herunterskalieren muss. Zum Beispiel:
| Kontext | Verwendete Groesse | Wahrscheinlicher Frame |
|---|---|---|
| Datei-Explorer (extra gross) | 256×256 | PNG ✓ |
| Datei-Explorer (gross/mittel) | 48×48 | BMP ✗ |
| Titelleiste / kleines Symbol | 16×16 | BMP ✗ |
| Alt+Tab-Umschalter | 32×32 | BMP ✗ |
Das Icon deiner App sieht also auf dem Desktop perfekt aus, entwickelt aber in der Titelleiste oder im Aufgabenwechsel einen mysterioesen "Halo" oder eine vermurkste Transparenz. Die meisten geben dann Windows die Schuld. Dabei ist es das ICO.
So ueberpruefst du deine ICO-Dateien
Es gibt viele kostenlose Werkzeuge, die alle Frames einer ICO-Datei auflisten koennen. Achte auf:
- Frame-Format: Der 256px-Frame sollte
PNGanzeigen. Kleinere Frames solltenBMPheissen. PNG fuer alle Frames zu verwenden ist gemaess der ICO-Spezifikation technisch gueltig, kann jedoch auf aelteren Windows-Versionen Kompatibilitaetsprobleme verursachen. Eine Kombination aus PNG (256px) + BMP (kleinere Groessen) ist die sicherste Wahl. - BMP-Bittiefe: Sollte
32 BPP(32 Bit pro Pixel) betragen fuer echte Alphakanal-Unterstuetzung (halbtransparentes Blending). Bei24 BPPsind die pro-Pixel-Alpha-Daten verloren — der Frame kann zwar noch auf die ICO-Legacy-1-Bit-AND mask fuer einfaches "alles-oder-nichts"-Hintergrund-Clipping zurueckgreifen, aber alle kantenglaetteten Raender, halbtransparenten Verlaeufe und Schatten brechen und werden zu haesslichen festen Artefakten oder dicken schwarzen Raendern auf modernen Systemen. - Sichtpruefung: Lade jeden Frame einzeln. Die kleineren Frames sollten sauberes, weiches Alpha aufweisen, keine ausgefransten Raender oder einfarbige Hintergruende.
So behebst du das Problem
Option 1: Einen richtigen Icon-Editor verwenden und den Konverter testen
Nimm dein Quell-PNG und erzeuge mit einem ordentlichen Editor, der den BMP-Alphakanal korrekt verarbeitet, ein neues ICO. Bevor du einem Konverter vertraust — ob online oder offline — fuehre einen Test durch: Erstelle ein ICO aus einem PNG mit bekannten halbtransparenten Bereichen (weiche Schatten, Verlaeufe usw.) und pruefe dann jeden Frame. Wenn irgendein BMP-Frame kaputtes Alpha hat, ist dieser Konverter nicht sicher zu verwenden.
Option 2: PNG-Only-ICO (wenn moeglich)
Einige moderne Werkzeuge akzeptieren ICO-Dateien, die PNG-Kompression fuer alle Frames verwenden, nicht nur fuer 256×256. Das umgeht das BMP-Alpha-Problem komplett. Allerdings wird dies nicht von allen Windows-Versionen und Anwendungen unterstuetzt — teste es gruendlich, bevor du dich darauf verlaesst.
Wichtigste Erkenntnisse
- Nur weil ein ICO im Explorer gut aussieht, heisst das noch lange nicht, dass es in Ordnung ist
- Der 256×256-PNG-Frame ist meist korrekt; jeder kleinere BMP-Frame kann kaputt sein
- Kaputter BMP-Alpha ist in den meisten Ansichten unsichtbar — er beisst dich nur in Titelleisten, Alt+Tab und anderen Kontexten mit kleinen Symbolen
- Teste deinen Online-Konverter mit einem bekannten halbtransparenten PNG, bevor du dich auf ihn verlaesst
- Verwende einen richtigen Icon-Editor fuer alles, was du auslieferst — die 5 Minuten sind es wert
Teil der Dev-Fallen-Serie.