37 lines
1.4 KiB
JavaScript
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)') |