Files
font2pic/apiserver/svg_to_png.js
2026-02-08 22:31:25 +08:00

62 lines
1.5 KiB
JavaScript

#!/usr/bin/env node
const sharp = require('sharp')
function parseArgs(argv) {
const parsed = {}
for (let i = 2; i < argv.length; i += 1) {
const key = argv[i]
const value = argv[i + 1]
if (key === '--width' && value) {
parsed.width = Number(value)
i += 1
continue
}
if (key === '--height' && value) {
parsed.height = Number(value)
i += 1
}
}
return parsed
}
async function main() {
const args = parseArgs(process.argv)
const chunks = []
process.stdin.on('data', (chunk) => {
chunks.push(chunk)
})
process.stdin.on('end', async () => {
try {
const svgBuffer = Buffer.concat(chunks)
if (!svgBuffer.length) {
throw new Error('empty svg input')
}
const width = Number.isFinite(args.width) && args.width > 0 ? Math.round(args.width) : null
const height = Number.isFinite(args.height) && args.height > 0 ? Math.round(args.height) : null
let pipeline = sharp(svgBuffer, { density: 300 })
if (width || height) {
pipeline = pipeline.resize({
width: width || undefined,
height: height || undefined,
fit: 'contain',
background: { r: 255, g: 255, b: 255, alpha: 1 },
withoutEnlargement: false,
})
}
const pngBuffer = await pipeline.png({ compressionLevel: 9 }).toBuffer()
process.stdout.write(pngBuffer)
} catch (error) {
process.stderr.write(`svg_to_png_error: ${error && error.message ? error.message : String(error)}\n`)
process.exit(1)
}
})
}
main()