A JavaScript library to use ICO. Works on both Node.js and the browser.
npm install icojsimport { decodeIco, encodeIco, isIco } from 'icojs';A UMD bundle is also available for browsers.
<script src="node_modules/icojs/dist/ico.js"></script>- Decoder: https://egy186.github.io/icojs/demo-decoder.html
- Encoder: https://egy186.github.io/icojs/demo-encoder.html
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>