compress-picture-js
Version:
40 lines (33 loc) • 1.22 kB
text/typescript
import { IOptions } from '../../util/option/option.util.js';
import { IResponse, responseUtil } from '../../util/response/response.util.js';
import {
CreateDirSyncFromFilename,
ReadFileSync,
WriteFileSync,
} from '../../util/file/file.util.js';
import pnglib from 'upng-js';
// CompressPNG 压缩PNG
export function CompressPNG(options: IOptions): IResponse {
let resp = responseUtil.DefaultIResponse();
// console.log("🚀", options);
// 图片
const imgBuffer = ReadFileSync(options['input']);
const img = pnglib.decode(imgBuffer);
const rgba: ArrayBuffer[] = pnglib.toRGBA8(img);
// 压缩比例:cnum = Or just use 0 for lossless / 256 for lossy.
const compressQuality = pngCompressQuality(options['quality']);
// console.log("🚀", compressQuality)
const pngImg = pnglib.encode(rgba, img.width, img.height, compressQuality);
// 检查输出文件夹
CreateDirSyncFromFilename(options['output']);
// 写文件
WriteFileSync(options['output'], pngImg);
return resp;
}
// pngCompressQuality png压缩质量
function pngCompressQuality(quality: number): number {
if (quality < 0 || quality >= 100) {
return 0;
}
return Math.ceil((256 * (100 - quality)) / 100);
}