Skip to content

Instantly share code, notes, and snippets.

@stu43005
Created July 25, 2019 06:34
Show Gist options
  • Save stu43005/0d71ba70716804904d371b18ef43cc7c to your computer and use it in GitHub Desktop.
Save stu43005/0d71ba70716804904d371b18ef43cc7c to your computer and use it in GitHub Desktop.
LINE 貼圖轉換圖片大小為512,適用於Telegram

用法

npm i sharp
  • 下載 LINE 貼圖包 ({id}替代為貼圖ID)
http://dl.stickershop.line.naver.jp/products/0/0/1/{id}/iphone/[email protected]
  • 執行 resize.js
node ./resize.js

Refrence

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();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment