Turn one image into a full icon set, including a real multi-size favicon.ico read back from its own bytes before it is offered. Names the resampling filter, states what a square crop discarded, and decodes every PNG again to confirm its size.
Initializing in your browser…
Placeholder images described once and drawn two ways, so the preview, the raster and the SVG are the same picture. The label is measured and made to fit, and the quality slider only appears where quality does something.
Build a favicon from text, an emoji or an image and get a real favicon.ico holding 16, 32 and 48 pixel images, seven PNGs, a web app manifest and the head tags, in one archive, with the ICO parsed back from its own bytes before it is offered
Twelve procedural patterns that tile exactly, verified live with a measured wrap error and a 3 by 3 repeat view. Perlin, fractal, ridged, Voronoi, marble, wood and geometric grids.
One 512 by 512 logo, asked for the web set plus a favicon.ico.
Input
logo.png · crop to fill · Lanczos 3
What comes out, and what opened it
favicon.ico ICONDIR type 1, 3 entries: 16x16, 32x32, 48x48
every BMP declares double its height (32 -> 64)
read back here, and opened by Pillow as ICO
five PNGs each decoded again: exactly the size requested
site.webmanifest 192 and 512, the two Chrome installability names
head-tags.html link and meta tags for the setA .ico is a container, not a renamed PNG, and the field naive writers get wrong is the BITMAPINFOHEADER height: inside an ICO it is DOUBLED, because the header covers the image and its transparency mask together. This one is written from that layout and then parsed again before it is offered, so a writer that has drifted produces nothing rather than a file some readers quietly ignore.
Turn one image into a full icon set for the web, iOS, Android and Windows, including a real multi-size favicon.ico that is read back from its own bytes before it is offered. The downscale names the filter it used, the fit is a choice with its cost in pixels stated, and every file is decoded again to confirm its size.
The PNG sizes, a real .ico, the manifest and the tags in one archive, with each file checked before it goes in.
The 1024 pixel Apple size and the 512 pixel Android size, both resampled with a named filter rather than whatever a canvas felt like.
See exactly what a square crop would cost before choosing it, and pick fit inside instead if the ends matter.
Add padding so the artwork survives the launcher cropping the icon to a circle.
Upload a square logo and download favicon.ico: a three-image container at 16, 32 and 48 pixels, read back before it is handed over. Pillow opens it and reports all three sizes.
Choose fit inside rather than crop to fill. The panel then reports zero source pixels discarded, and the 512 icon comes out with the whole wordmark and transparent bars above and below it.
One source image becomes a set of square icons, and the two things a generator can get wrong are both settled here by asking something else.
The first is the ICO. A `.ico` is a container: a six-byte ICONDIR, a sixteen-byte directory entry per image, then the images themselves, and a browser asks for `/favicon.ico` whether or not the page declares it. A PNG saved under an `.ico` name is not one, and the field a naive writer gets wrong is specific: a BMP inside an ICO declares DOUBLE its own height, because the BITMAPINFOHEADER describes the image and its transparency mask together, so a 32 pixel icon says 64. This tool writes the container from that layout, at 16, 32 and 48 pixels, and then READS IT BACK with a parser that refuses a file it cannot walk, checking that doubled field on every entry. If the read fails the file is not offered at all. In the test suite the produced file is handed to Pillow, which opens it as an ICO and reports the three sizes.
The second is what happens to a picture that is not square. Making a square out of an 800 by 400 logo means throwing half of it away or leaving space around it, and those are different pictures. The old behaviour was a silent crop, which is what `Math.max(target/width, target/height)` does. It is now a choice of three with the consequence stated in numbers: crop to fill reports that it discarded 160,000 of the 320,000 source pixels, fit inside reports that it discarded none and left the background showing, and stretch says it changed the proportions.
The downscale itself goes through this project's resampler rather than through `drawImage`, so the filter is named and cited: Lanczos 3 from the windowed sinc of Duchon (1979) by default, with the Mitchell and Netravali cubics (SIGGRAPH 1988), Catmull-Rom, triangle, box and nearest neighbour available. Alpha is premultiplied before filtering, so a cut-out logo picks up no dark halo around its edges. Every PNG that comes out is then DECODED AGAIN and its size compared with the size that was asked for, and the page reports that comparison rather than assuming it.
Shape, background and padding are applied as they were: square, a rounded rectangle with a corner radius of a fifth of the side, or a circle, over a transparent, white, black or chosen background, with a padding slider that insets the artwork on all four sides. Padding is the control that matters for Android adaptive icons, whose launcher crops to a circle.
The archive holds every selected PNG, `favicon.ico` when it read back cleanly, a `site.webmanifest` naming the 192 and 512 icons that Chrome's installability criteria ask for, and a `head-tags.html` with the link and meta tags. `favicon.ico` gets a link tag with a size because that is what tells a browser which of the container's images to prefer. Everything runs in the browser and nothing is uploaded.
Yes, and it is checked rather than claimed. The file is written from the ICONDIR and ICONDIRENTRY layout with three images inside it, then parsed again by a reader that walks every entry and verifies the doubled height field a BMP inside an ICO requires. If that read fails the file is not offered for download at all. In the test suite the downloaded file is opened by Pillow, which reports it as an ICO holding 16, 32 and 48 pixel images.
Because the BITMAPINFOHEADER describes the colour image and the one-bit transparency mask stacked together, so the height field covers both. A 32 pixel icon declares 64. It is the single field naive ICO writers get wrong, and a file that gets it wrong is silently ignored by some readers rather than rejected.
Whatever you choose. Crop to fill takes a centred square and says how many source pixels it discarded; on an 800 by 400 source that is 160,000 of 320,000. Fit inside keeps the whole picture and leaves the background showing, discarding nothing. Stretch squeezes it and says so. The old behaviour was the first of those, applied silently.
Lanczos 3 for a photograph or a detailed mark; it is the sharpest and rings slightly at hard edges. Box for flat graphics with large areas of one colour, where a sharp filter adds nothing. The filter is named on the page along with the paper that defines it, so the choice is recorded rather than left to the browser.
Each one is decoded again after it is written and its actual pixel dimensions are compared with the size that was asked for. The page reports that comparison for the whole set rather than assuming the encoder did what it was told.
The Favicon Generator if you want the web set and nothing else: seven files, the manifest and the tags, no choices to make. This one if you need the per-platform lists, or if the artwork has to be shaped, padded or placed on a background first.
Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.