icojs
    Preparing search index...

    icojs

    npm CI Coverage Status

    A JavaScript library to use ICO. Works on both Node.js and the browser.

    npm install icojs
    
    import { decodeIco, encodeIco, isIco } from 'icojs';
    

    A UMD bundle is also available for browsers.

    <script src="node_modules/icojs/dist/ico.js"></script>
    

    Node.js:

    import { readFile, writeFile } from 'node:fs/promises';
    import { decodeIco } from 'icojs';

    const buffer = await readFile('favicon.ico');
    const images = await decodeIco(buffer, 'image/png');
    // save as png files
    images.forEach(image => {
    const file = `${image.width}x${image.height}-${image.bpp}bit.png`;
    const data = Buffer.from(image.buffer);
    writeFile(file, data);
    });

    Browser:

    <input type="file" id="input-file" />
    <script>
    document.querySelector('#input-file').addEventListener('change', async evt => {
    const file = evt.target.files[0];
    const buffer = await file.arrayBuffer();
    const images = await ICO.decodeIco(buffer);
    // logs images
    console.dir(images);
    });
    </script>

    Node.js:

    import { readFile, writeFile } from 'node:fs/promises';
    import { encodeIco } from 'icojs';

    const buffer1 = await readFile('16x16.png');
    const buffer2 = await readFile('32x32.png');
    const ico = await encodeIco([
    { buffer: buffer1 },
    { buffer: buffer2 }
    ]);
    // save as a ico file
    writeFile('favicon.ico', Buffer.from(ico));

    Browser:

    <input type="file" id="input-file" multiple />
    <script>
    document.querySelector('#input-file').addEventListener('change', async evt => {
    const files = Array.from(evt.target.files);
    const iconList = await Promise.all(files.map(async file => {
    const buffer = await file.arrayBuffer();
    return { buffer };
    }));
    const ico = await ICO.encodeIco(iconList);
    // logs ico
    console.dir(ico);
    });
    </script>

    https://egy186.github.io/icojs/