|Internet media type|
|Uniform Type Identifier (UTI)||com.microsoft.ico|
|Type of format||Graphics file format for computer icons|
|Container for||BMP and PNG|
|Internet media type||image/vnd.microsoft.icon|
|Uniform Type Identifier (UTI)||com.microsoft.cur|
|Type of format||Graphics file format for mouse cursors|
The ICO file format is an image file format for computer icons in Microsoft Windows. ICO files contain one or more small images at multiple sizes and color depths, such that they may be scaled appropriately. In Windows, all executables that display an icon to the user, on the desktop, in the Start Menu, or in Windows Explorer, must carry the icon in ICO format.
The CUR file format is an almost identical image file format for non-animated cursors in Microsoft Windows. The only differences between these two file formats are the bytes used to identify them and the addition of a hotspot in the CUR format header; the hotspot is defined as the pixel offset (in x,y coordinates) from the top-left corner of the cursor image where the user is actually pointing the mouse.
The ANI file format is used for animated Windows cursors.
Icons introduced in Windows 1.0 were 32×32 pixels in size and were monochrome. Support for 16 colors was introduced in Windows 3.0.
Win32 introduced support for storing icon images of up to 16.7 million colors (TrueColor) and up to 256x256 pixels in dimensions. Windows 95 also introduced a new Device Independent Bitmap (DIB) engine. However, 256 color was the default icon color depth in Windows 95. It was possible to enable 65535 color (Highcolor) icons by either modifying the Shell Icon BPP value in the registry or by purchasing Microsoft Plus! for Windows 95. The Shell Icon Size value allows using larger icons in place of 32×32 icons and the Shell Small Icon Size value allows using custom sizes in place of 16×16 icons. Thus, a single icon file could store images of any size from 1×1 pixel up to 256×256 pixels (including non-square sizes) with 2 (rarely used),16, 256, 65535, or 16.7 million colors; but the shell could not display very large sized icons. The notification area of the Windows taskbar was limited to 16 color icons by default until Windows Me when it was updated to support high color icons.
Windows XP added support for 32-bit color (16.7 million colors plus 8-bit alpha channel transparency) icon images, thus allowing semitransparent areas like shadows, anti-aliasing, and glass-like effects to be drawn in an icon. Windows XP, by default, employs 48×48 pixel icons in Windows Explorer. Windows XP can be forced to use icons as large as 256×256 by modifying the Shell icon size value but this would cause all 32×32 icons throughout the shell to be upscaled. Microsoft only recommended icon sizes up to 48×48 pixels for Windows XP. Windows XP can downscale larger icons if no closer image size is available.
Windows Vista added full support for 256×256-pixel 32-bit color icons,[Notes 1] as well as support for the compressed PNG format. Although compression is not required, Microsoft recommends that all 32-bit color 256×256 icons in ICO files should be stored in PNG format to reduce the overall size of the file. The Windows Vista Explorer supports smoothly scaling icons to non-standard sizes which are rendered on the fly even if an image is not present for that size in the icon file. The Windows Vista shell adds a slider for "zooming" the icon sizes in and out. With users using higher resolutions and high DPI modes, larger icon formats (such as 256×256) are recommended.
While the IANA-registered MIME type for ICO files is
image/vnd.microsoft.icon, it was submitted to IANA in 2003 by a third party and is not recognised by Microsoft software, which uses
image/ico instead. Erroneous types
application/ico have also been seen in use.
An ICO or CUR file is made up of an ICONDIR ("Icon directory") structure, containing an ICONDIRENTRY structure for each image in the file, followed by a contiguous block of all image bitmap data (which may be in either Windows BMP format, excluding the BITMAPFILEHEADER structure, or in PNG format, stored in its entirety).
Images with less than 32 bits of color depth follow a particular format: the image is encoded as a single image consisting of a color mask (the "XOR mask") together with an opacity mask (the "AND mask"). The XOR mask must precede the AND mask inside the bitmap data; if the image is stored in bottom-up order (which it most likely is), the XOR mask would be drawn below the AND mask. The AND mask is 1 bit per pixel, regardless of the color depth specified by the BMP header, and specifies which pixels are fully transparent(1) and which are fully opaque(0). The XOR mask conforms to the bit depth specified in the BMP header and specifies the numerical color or palette value for each pixel. Together, the AND mask and XOR mask make for a non-transparent image representing an image with 1-bit transparency; they also allow for inversion of the background. The height for the image in the ICONDIRENTRY structure of the ICO/CUR file takes on that of the intended image dimensions (after the masks are composited), whereas the height in the BMP header takes on that of the two mask images combined (before they are composited). Therefore, the masks must each be of the same dimensions, and the height specified in the BMP header must be exactly twice the height specified in the ICONDIRENTRY structure.
32-bit images (including 32-bit BITMAPINFOHEADER-format BMP images[Notes 2]) are specifically a 24-bit image with the addition of an 8-bit channel for alpha compositing. Thus, in 32-bit images, the AND mask is not required, but recommended for consideration. Windows XP and higher will use a 32-bit image in less than True color mode by constructing an AND mask based on the alpha channel (if one does not reside with the image already) if no 24-bit version of the image is supplied in the ICO/CUR file. However, earlier versions of Windows interpret all pixels with 100% opacity unless an AND mask is supplied with the image. Supplying a custom AND mask will also allow for tweaking and hinting by the icon author. Even if the AND mask is not supplied, if the image is in Windows BMP format, the BMP header must still specify a doubled height.
It's important to note that in the AND mask, as for the pixel array of the bitmap, padding bytes must be appended to the end of each row in order to bring up its length to a multiple of four bytes since it's basically a (monochrome) bitmap. The AND mask of an 8x8 pixels bitmap would have 1 byte of data and 3 bytes of padding(8*8*1bpp = 64 bits/8 = 8 bytes of total rows, so each row is 1 byte and 3 bytes of padding are needed), a 16x16 bitmap's AND mask would have 2 bytes of data and 2 bytes of padding, a 32x32 bitmap's AND mask would have 4 bytes of data and no padding. Note that the quantity of padding bytes needed depend on the dimensions of the bitmap and not its color depth since the AND mask is 1 bit per pixel regardless.
All values in ICO/CUR files are represented in little-endian byte order.
|0||2||Reserved. Must always be 0.|
|2||2||Specifies image type: 1 for icon (.ICO) image, 2 for cursor (.CUR) image. Other values are invalid.|
|4||2||Specifies number of images in the file.|
|Image #1||Entry for the first image|
|Image #2||Entry for the second image|
|Image #n||Entry for the last image|
|0||1||Specifies image width in pixels. Can be any number between 0 and 255. Value 0 means image width is 256 pixels.[Notes 1]|
|1||1||Specifies image height in pixels. Can be any number between 0 and 255. Value 0 means image height is 256 pixels.[Notes 1]|
|2||1||Specifies number of colors in the color palette. Should be 0 if the image does not use a color palette.|
|3||1||Reserved. Should be 0.|
|8||4||Specifies the size of the image's data in bytes|
|12||4||Specifies the offset of BMP or PNG data from the beginning of the ICO/CUR file|
All image data referenced by entries in the image directory proceed directly after the image directory. It is customary practice to store them in the same order as defined in the image directory.
Recall that if an image is stored in BMP format, it must exclude the opening BITMAPFILEHEADER structure, whereas if it is stored in PNG format, it must be stored in its entirety.
Note that the height of the BMP image must be twice the height declared in the image directory. The second half of the bitmap should
be an AND mask for the existing screen pixels, with the output pixels given by the formula
Output = (Existing AND Mask) XOR Image. Set the mask to be zero everywhere for a clean overwrite.
The ability to read PNG images from ICO and CUR format images was introduced in Windows Vista. A PNG image can be stored in the image in the same way as done for a standard Windows BMP format image, with the exception that the PNG image must be stored in its entirety, with its file header and must be in 32bpp ARGB format.
Icons in Portable Executable (EXE or DLL) files are organised in resources of type RT_GROUP_ICON and RT_ICON.
RT_GROUP_ICON resources contain GRPICONDIR and one or more GRPICONDIRENTRY structures which have almost the same format as corresponding ICONDIR and ICONDIRENTRY structures in ICO files. Difference is in GRPICONDIRENTRY that the last member of the structure contains two-byte resource identifier of the RT_ICON instead of image offset in the file.
RT_ICON resources have the same image data format as in ICO files and can store PNG images as well.
Cursors are organized in the same way as icons but in resources of type RT_GROUP_CURSOR and RT_CURSOR. The only difference that the first four bytes of RT_CURSOR contain the cursor hot spot data (CUR files have this data in ICONDIR).
An icon library is a way to package Windows icons. It is typically a 16-bit New Executable or a 32-bit Portable Executable binary file having .ICL extension with icon resources being the packaged icons. Windows Vista and later versions do not support viewing icons from 16-bit (New Executable) files.
The cursor is loaded properly at whatever color depth the cursor was authored. However, the system cannot distinguish between multiple candidates in the same cursor file or resource that differ only by their color depths. Icons, however, fully support multiple icon candidates with varying color depths.
((cite web)): CS1 maint: url-status (link)
Icons have a maximum size of 256x256 pixels, making them suitable for high-dpi (dots per inch) displays. These high-resolution icons allow for high visual quality in list views with large icons... Only a 32-bit copy of the 256x256 pixel image should be included, and only the 256x256 pixel image should be compressed to keep the file size down.