---------------------------------------------------------------------- Basic Description Windows uses ICO files to display its Icons. There can (and for compatibility's sake should) be more than 1 picture in an ICO file. For general purpose ICOs there should be at least one 32x32 image using the 16 Windows colors. ---------------------------------------------------------------------- Basic File Format Name Size Description Reserved 2 byte =0 Type 2 byte =1 Count 2 byte Number of Icons in this file Entries Count * 16 List of icons {Width 1 byte Cursor Width (16, 32 or 64) Height 1 byte Cursor Height (16, 32 or 64 , most commonly = Width) ColorCount 1 byte Number of Colors (2,16, 0=256) Reserved 1 byte =0 Planes 2 byte =1 BitCount 2 byte bits per pixel (1, 4, 8) SizeInBytes 4 byte Size of (InfoHeader + ANDbitmap + XORbitmap) FileOffset 4 byte FilePos, where InfoHeader starts } repeated Count times InfoHeader 40 bytes Variant of BMP InfoHeader Size 4 bytes Size of InfoHeader structure = 40 Width 4 bytes Icon Width Height 4 bytes Icon Height (added height of XOR-Bitmap and AND-Bitmap) Planes 2 bytes number of planes = 1 BitCount 2 bytes bits per pixel = 1, 4, 8 Compression 4 bytes Type of Compression = 0 ImageSize 4 bytes Size of Image in Bytes = 0 (uncompressed) XpixelsPerM 4 bytes unused = 0 YpixelsPerM 4 bytes unused = 0 ColorsUsed 4 bytes unused = 0 ColorsImportant 4 bytes unused = 0 Colors NumberOfColors * 4 bytes Color Map for XOR-Bitmap {Red 1 byte red component Green 1 byte green component Blue 1 byte blue component reserved 1 byte =0 }repeated NumberOfColors times XORBitmap see below bitmap ANDBitmap see below monochrome bitmap ---------------------------------------------------------------------- Raster Data encoding The XOR Bitmap is stored as 1-bit, 4-bit or 8-bit uncompressed Bitmap using the same encoding as BMP files. The AND Bitmap is stored in as 1-bit uncompressed Bitmap.  Pixels are stored bottom-up, left-to-right. Pixel lines are padded with zeros to end on a 32bit (4byte) boundary. Every line will have the same number of bytes. Color indices are zero based, meaning a pixel color of 0 represents the first color table entry, a pixel color of 255 (if there are that many) represents the 256th entry. Raster Data encoding for 1bit / black & white XORbitmaps and for the AND-bitmap BitCount = 1 Compression = 0  Every byte holds 8 pixels, its highest order bit representing the leftmost pixel of those. There are 2 color table entries. Some readers will ignore them though, and assume that 0 is black and 1 is white. If you are storing black and white pictures you should stick to this, with any other 2 colors this is not an issue. Remember padding with zeros up to a 32bit boundary (This can be up to 31 zeros/pixels!)  Raster Data encoding for 4bit / 16 color XORbitmaps BitCount = 4 Compression = 0  Every byte holds 2 pixels, its high-order 4 bits representing the left of those. There are 16 color table entries. These colors do not have to be the 16 MS-Windows standard colors. Padding each line with zeros up to a 32bit boundary will result in up to 28 zeros = 7 'wasted pixels'. Raster Data encoding for 8bit / 256 color XORbitmaps BitCount = 8 Compression = 0  Every byte holds 1 pixel. There are 256 color table entries. Padding each line with zeros up to a 32bit boundary will result in up to 3 bytes of zeros = 3 'wasted pixels'. ---------------------------------------------------------------------- Portability Since ICO Files are a derivatives of BMPs they should be quite easily converted into two BMPs, one holding the (possibly colored) XOR Image and one holding the monochrome AND Image. Due to the XOR-AND-scheme which may not apply to other OS, these files are not very portable, and were never intended to be. 2byte and 4byte entries are stored in Intel order (Least significant byte first)