|
const fs = require('fs'); |
|
const sharp = require('sharp'); |
|
|
|
async function resizePng(name, q = 100) { |
|
return new Promise(function (resolve, reject) { |
|
if (q < 1) { |
|
let text = '發生錯誤,已中斷下載\n'; |
|
text += '問題來源: resize webp\n'; |
|
text += '編號: <code>' + name + '</code> \n'; |
|
text += '詳細報告: 檔案過大\n'; |
|
return reject(text); |
|
} |
|
|
|
const origin = './' + name + '@2x.png'; |
|
const sticker = './sticker/' + name + '-' + q + '.png'; |
|
|
|
let format = 'webp'; |
|
let tmpFile = './temp/' + name + '-' + q + '.webp'; |
|
let size = 512; |
|
if (q < 64) { |
|
console.log('resize png comp', name, q); |
|
format = 'jpg'; |
|
tmpFile = './temp/' + name + '-' + q + '.jpg'; |
|
size = 8 * q; |
|
} |
|
|
|
let errorF = false; |
|
|
|
sharp(origin) |
|
.toFormat(format, { |
|
quality: q, |
|
}) |
|
.resize(size, size) |
|
// .max() |
|
.toFile(tmpFile) |
|
.catch((err) => { |
|
console.error('sharp err 1', name, origin, err); |
|
errorF = true; |
|
|
|
let text = '發生錯誤,已中斷下載\n'; |
|
text += '問題來源: NodeJS <b>sharp</b> (圖片轉檔工具)\n'; |
|
text += '編號: <code>' + name + '</code> \n'; |
|
text += '詳細報告: resize webp\n'; |
|
if (err.message != undefined) {text += '<pre>' + enHTML(err.message) + '</pre>';} |
|
else {text += '<pre>' + enHTML(err) + '</pre>';} |
|
return reject(text); |
|
}) |
|
.then((result) => { |
|
if (errorF) { |
|
console.error('resizePng', 'error = true', 'stage 1', result); |
|
return; |
|
} |
|
|
|
sharp(tmpFile) |
|
.resize(512, 512) |
|
// .max() |
|
.png() |
|
.toFile(sticker) |
|
.then((result2) => { |
|
if (errorF) { |
|
console.error('resizePng', 'error = true', 'stage 2', result2); |
|
return; |
|
} |
|
|
|
const stat = fs.statSync(sticker); |
|
if (stat.size < 512 * 1000) { |
|
return resolve(sticker); |
|
} |
|
resizePng(name, Math.floor(q * 0.8)) |
|
.catch((err) => { |
|
errorF = true; |
|
|
|
return reject(err + '.'); |
|
}) |
|
.then((sticker2) => { |
|
if (errorF) { |
|
console.error('resizePng', 'error = true', 'stage 3', result2); |
|
return; |
|
} |
|
|
|
return resolve(sticker2); |
|
}); |
|
}) |
|
.catch((err) => { |
|
console.error('sharp err 2', name, origin, tmpFile, err); |
|
errorF = true; |
|
|
|
let text = '發生錯誤,已中斷下載\n'; |
|
text += '問題來源: NodeJS <b>sharp</b> (圖片轉檔工具)\n'; |
|
text += '編號: <code>' + name + '</code> \n'; |
|
text += '詳細報告: convert png\n'; |
|
text += '<pre>' + enHTML(err.message) + '</pre>'; |
|
return reject(text); |
|
}); |
|
}); |
|
}); |
|
} |
|
|
|
async function main() { |
|
if (!fs.existsSync('sticker/')) { |
|
fs.mkdirSync('sticker/'); |
|
} |
|
if (!fs.existsSync('temp/')) { |
|
fs.mkdirSync('temp/'); |
|
} |
|
|
|
const meta = JSON.parse(fs.readFileSync('productInfo.meta', 'utf8')); |
|
for (let seq = 1; seq <= meta.stickers.length; seq++) { |
|
try { |
|
const sid = meta.stickers[seq - 1].id; |
|
await resizePng(sid); |
|
if (seq == meta.stickers.length) { |
|
console.log('完成!'); |
|
} |
|
} |
|
catch (error) { |
|
console.log('err', error); |
|
return; |
|
} |
|
} |
|
} |
|
main(); |