BMP to ICO Crop Converter
Load a BMP image, drag the crop handles to define exactly the area you need, preview the result, then download an ICO icon file. Everything runs in your browser — your image never leaves your device.
Drop a BMP here
or Browse Files · BMP supported
What This Tool Does
This tool loads a BMP image directly in your browser, presents an interactive crop overlay with draggable handles, and converts the selected area to an ICO file. No server upload is required. The full workflow — loading, cropping, encoding — runs entirely in client-side JavaScript using the HTML5 Canvas API. BMP files are loaded using URL.createObjectURL() combined with img.decode(), which guarantees the image is fully pixel-decoded before the canvas draws it, preventing the silent blank-canvas problem that can affect asynchronous image loading. The output is an ICO file with an embedded PNG image, compatible with Windows Vista and later, all major browsers for favicon use, and any icon-aware application.
Who This Is For
- Web developers who have BMP source artwork and need a cropped favicon in ICO format
- Designers preparing Windows application icons from legacy BMP bitmap files
- Anyone converting a specific region of a BMP image to an icon without installing software
- Developers who need a quick crop-and-convert workflow that stays entirely in the browser
BMP vs ICO: Format Comparison
| Property | BMP | ICO |
|---|---|---|
| Primary use | Raster images, legacy graphics | Application icons, favicons |
| Compression | Uncompressed (or RLE) | PNG or BMP embedded (varies) |
| Transparency support | Limited (1-bit mask only) | Yes (32-bit RGBA) |
| Multiple sizes in one file | No | Yes — standard for icons |
| Browser favicon support | No | Universal — every browser |
| Windows icon support | No | Yes — native |
| Typical file size | Large (uncompressed pixels) | Small (PNG-embedded) |
| Best for | Legacy paint apps, print layouts | Favicons, Windows icons, app icons |
Frequently Asked Questions
URL.createObjectURL() to generate an object URL and then calling img.decode() ensures that the image is fully pixel-decoded before the canvas draws it. The decode() method returns a Promise that resolves only after the full decode is ready — guaranteed non-blank pixels. This is the same reliable pattern used for AVIF and other formats that require asynchronous decoding.