import fs from 'fs' import path from 'path' import { fileURLToPath } from 'url' import pngToIco from 'png-to-ico' import { Resvg } from '@resvg/resvg-js' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const root = path.resolve(__dirname, '..') const buildDir = path.join(root, 'build') const srcSvg = path.join(buildDir, 'app-icon.svg') const outPng = path.join(buildDir, 'icon.png') const outIco = path.join(buildDir, 'icon.ico') if (!fs.existsSync(srcSvg)) { console.error(`[gen:icons] missing ${srcSvg}`) process.exit(1) } fs.mkdirSync(buildDir, { recursive: true }) const svgBuf = fs.readFileSync(srcSvg) const svg = svgBuf.toString('utf8') function renderSvgToPngBuffer(svgInputUtf8, size) { const resvg = new Resvg(svgInputUtf8, { fitTo: { mode: 'width', value: size }, background: 'rgba(0,0,0,0)', }) const img = resvg.render() return img.asPng() } // 生成一张 256x256 的 PNG(也可供托盘/文档等使用) fs.writeFileSync(outPng, renderSvgToPngBuffer(svg, 256)) // Windows .ico:包含多尺寸位图更稳(任务栏/快捷方式/高 DPI) const sizes = [16, 24, 32, 48, 64, 128, 256] const pngBuffers = sizes.map((s) => renderSvgToPngBuffer(svg, s)) const ico = await pngToIco(pngBuffers) fs.writeFileSync(outIco, ico) console.log(`[gen:icons] wrote ${path.relative(root, outIco)} and ${path.relative(root, outPng)}`)