iboard/scripts/generate-icons.mjs
2026-08-03 18:05:50 +08:00

37 lines
1.4 KiB
JavaScript

// 从 public/favicon.svg 派生 Tauri 需要的各尺寸 PNG 图标
// 用法: node scripts/generate-icons.mjs
// 一次性脚本, 生成的图标随仓库提交, 不需要每次都跑
import sharp from 'sharp'
import path from 'node:path'
import fs from 'node:fs'
const SVG = path.join(process.cwd(), 'public', 'favicon.svg')
const OUT = path.join(process.cwd(), 'src-tauri', 'icons')
fs.mkdirSync(OUT, { recursive: true })
const svg = fs.readFileSync(SVG)
const base = sharp(svg)
// Tauri 桌面 + Android 需要的尺寸
const TARGETS = [
{ name: '32x32.png', size: 32 },
{ name: '128x128.png', size: 128 },
{ name: '128x128@2x.png', size: 256 },
{ name: 'icon.png', size: 1024 },
]
for (const t of TARGETS) {
const buf = await base.clone().resize(t.size, t.size).png().toBuffer()
fs.writeFileSync(path.join(OUT, t.name), buf)
console.log('wrote', t.name, t.size + 'x' + t.size)
}
// Windows .ico (单 256x256 frame, 简单够用)
const ico = await sharp(svg).resize(256, 256).png().toBuffer()
fs.writeFileSync(path.join(OUT, 'icon.ico'), ico)
console.log('wrote icon.ico (256x256 PNG-as-ICO)')
// macOS .icns: TaurCli 可用 png2icns 工具, 这里只放占位
// 如果未来要打 macOS DMG, 跑 cargo tauri icon 重新生成
fs.copyFileSync(path.join(OUT, 'icon.png'), path.join(OUT, 'icon.icns'))
console.log('wrote icon.icns (copy of icon.png, run cargo tauri icon to replace)')