Free ICO converter
ICO converter with the directory in view
Free, and no account is asked for: tick the frames you want between 16 and 256 px and this page writes them into a single .ico, showing the encoding, bit depth, byte length and offset the directory will record for each one. Frames go in as uncompressed BMP for readers as old as Windows 95, as PNG to keep a 256 px frame from costing 270,376 bytes, or on Auto, which splits at 64 px the way Windows itself does. Hand it an .ico instead of an image and it runs backwards: every frame in the file is listed and can be saved out as a PNG.
- 100% free
- No signup
- 7 frame sizes
- BMP or PNG frames
- Unpacks .ico too
An image becomes a multi-resolution .ico. An existing .ico is opened frame by frame and each frame comes back out as a PNG.
Press Ctrl+V anywhere on the page to drop in a screenshot or an image file — no need to click the field first.
How to convert an image to a multi-resolution ICO
Three steps to a file whose directory you can read before you ship it.
Open an image, or an .ico you want to look inside
Anything the browser can decode goes in as artwork: PNG, JPEG, WebP, GIF or SVG. Hand it a file ending in .ico or .cur instead and the page switches direction, reading the directory rather than writing one. Non-square artwork is fitted inside the square with the remainder transparent, so the aspect ratio survives even though an icon has to be a square.
Tick the frames the file should carry
16, 32 and 48 are on by default and cover a browser tab, a desktop shortcut and a Windows list view. Add 24 if the file will be used on Windows at 150% display scaling, where a 16 px slot asks for 24 real pixels, and add 256 if it will ever be shown as a large thumbnail in Explorer. Each frame is rendered from the source independently rather than by scaling the previous one.
Read the directory, then download
The table lists what the ICONDIR will actually contain: the encoding chosen for each frame, its bit depth, its length in bytes and the offset it starts at, plus the running total for the file. Those offsets are the format — a reader seeks to them — so if a frame looks wrong here, it will look wrong in Explorer. The Download button writes the same bytes the table describes.
Technical specifications
| Container written | A 6-byte ICONDIR, one 16-byte ICONDIRENTRY per frame, then the frame payloads at the offsets the directory records |
|---|---|
| Frames offered | 16, 24, 32, 48, 64, 128 and 256 px in any combination; the format's own limit is 65,535 frames in one file |
| BMP frame | 40-byte BITMAPINFOHEADER with the height doubled, bottom-up 32-bit BGRA rows, then a 1-bit AND mask padded to 4 bytes per row |
| PNG frame | The PNG file's own bytes, stored whole. Read by Windows Vista and later, and by every browser that renders .ico |
| Auto encoding rule | BMP up to 48 px, PNG from 64 px. At 256 px that is the difference between 270,376 bytes and roughly 20 KB |
| Size fields | One byte per axis with 0 standing for 256, so 256×256 is the largest frame the directory can describe |
| Reading an .ico | Directory parsed here; PNG frames handed to the browser, BMP frames decoded at 1, 4, 8, 24 and 32 bits, each frame saved out as PNG |
| Accepted input | PNG, JPEG, WebP, GIF and SVG as artwork, .ico and .cur for unpacking, 10 MB either way |
Frequently asked questions
How many images can one .ico hold?
The count field is a 16-bit integer, so 65,535 frames is the formal ceiling and nothing you would ever ship comes close. Microsoft's own icon guidance asks for 16, 24, 32, 48 and 256, and a file with those five covers every place Windows draws an icon. This page offers 16, 24, 32, 48, 64, 128 and 256.
Should the frames be BMP or PNG?
BMP for anything up to 48 px and PNG above it, which is what the Auto setting does. PNG frames inside an .ico were only understood from Windows Vista onward, so a file that must open on something older needs BMP throughout; the cost of that is size, because an uncompressed 256 px frame is 270,376 bytes while the same artwork as PNG is usually under 20 KB. Below 48 px the compression saves so little that the wider compatibility is free.
Why does the directory record a 256 px frame as width 0?
Because the width and height fields are one byte each, and 256 does not fit in a byte. The format resolves it by treating 0 as 256, which is also why 256×256 is the largest frame a .ico can address at all — anything bigger has no way to describe itself in the directory. Readers that predate the convention see a zero and skip the frame, which is one more reason to keep a 48 px frame in the file.
Can I go the other way and get PNGs out of an .ico?
Yes — hand it an .ico and every frame is listed and offered as a separate PNG. This is worth doing because a browser will render an .ico in an image tag but shows you only one frame of it, chosen by its own rules, and hides both the rest and the directory. PNG frames are passed through as they are; BMP frames are decoded here at 1, 4, 8, 24 and 32 bits per pixel.
Windows shows a different picture than my browser tab does.
They are picking different frames out of the same file, which is what a multi-resolution container is for. Explorer asks for the size its current view needs and the display scaling multiplies that: a 32 px slot at 200% scaling wants 64 real pixels and will take the 256 frame down to size if there is no 64. If two frames disagree artistically — a detailed 256 and a simplified 16 — that difference is deliberate in good icon sets and accidental in most.
Is a .cur cursor file the same format?
Nearly, and this page will read one. The header differs by a single field — type 2 instead of 1 — and the two bytes that hold color planes and bit count for an icon hold the hotspot coordinates for a cursor instead. That is why a .cur renamed to .ico often still displays: the frame data is laid out identically.
What is the AND mask for if the frames already have an alpha channel?
It is the transparency system that came first, and leaving it out breaks the frame's own arithmetic. A BMP frame declares a height of twice its real height precisely because the color rows are followed by a one-bit mask, one bit per pixel, padded to a four-byte boundary per row. Writers that omit it, or emit it filled with zeroes, produce icons that look right in a browser and draw an opaque rectangle in some Windows surfaces; the mask written here is derived from the alpha channel at a threshold of 128.
About the ICO container
ICO is not an image format so much as a box for several images, and it was designed that way for a reason that still holds. A Windows shell has to draw the same icon at 16 px in a list, at 32 px on a desktop and at 256 px in a preview pane, and no single bitmap survives all three: a mark that reads at 256 turns to gravel at 16, and a mark drawn for 16 is a blurry lump at 256. So the file holds a directory — six bytes of header, then a sixteen-byte record per frame giving its dimensions, bit depth, length and offset — and a reader seeks to whichever frame matches what it needs. That structure is why renaming a PNG to .ico has never worked: there is no directory at the front of a PNG, so nothing can find the pixels.
The wrinkle that catches most writers is that a frame can be stored two ways. The original is a BMP body with its header height doubled, bottom-up BGRA rows and a one-bit transparency mask stacked underneath, and it is completely uncompressed — the 40-byte header plus four bytes a pixel plus the mask, which comes to 1,128 bytes at 16 px and 270,376 at 256. Windows Vista added the option to drop a whole PNG file into the frame instead, which is the only sane way to carry 256 px. Two mistakes follow from not knowing that: tools that write a single frame and describe the result as multi-resolution, and tools that write 32-bit BMP frames with the AND mask zeroed out because the alpha channel seemed to make it redundant. The second one produces a file that looks perfect in a browser tab and shows a black rectangle in Explorer.
If what you need is the whole web icon set rather than one container — the Apple touch icon, the manifest PNGs and the markup — the favicon generator builds all of it and calls this same writer for the .ico inside it. For a single frame cropped out of a photograph, use image to ICO. Packing images side by side into one bitmap instead of stacking them in a container is a different technique with the same motivation, and that is the spritesheet generator. And if the artwork is flat enough that it should have been vector all along, PNG to SVG traces the contours and the SVG optimizer takes the editor cruft back out of the result.
Where the frames are encoded
Every number on this page is worked out by JavaScript running in the tab you are reading it in. Nothing you type, paste or open is uploaded, logged or kept, which is also why the tools carry on working after you disconnect from the network.
Unpacking an .ico is the same story in reverse: the directory is parsed from an ArrayBuffer the tab already holds, and the frames become object URLs that exist only until you close it.