diff --git a/src/product_cover_img.js b/src/product_cover_img.js index 5a76590..8d4188d 100644 --- a/src/product_cover_img.js +++ b/src/product_cover_img.js @@ -15,6 +15,11 @@ if (!inputDir || !previewDir) { //创建输出文件夹 cover.scaleArr.forEach((item) => { item.dir = `${inputDir}/${item.scale.join('x')}`; + // 如果之前存在生成的主图文件夹,先删除 + if (fs.existsSync(item.dir)) { + fs.rmSync(item.dir, { recursive: true, force: true }); + } + // 删除后再重新生成新的空文件夹 if (!fs.existsSync(item.dir)) { fs.mkdirSync(item.dir); } diff --git a/src/reduce_img_size.js b/src/reduce_img_size.js new file mode 100644 index 0000000..ca17f77 --- /dev/null +++ b/src/reduce_img_size.js @@ -0,0 +1,64 @@ +const sharp = require('sharp'); +const fs = require('fs'); +const path = require('path'); +const { getInputDir } = require('../utils/index'); +const { cover } = require('../config/index'); + +//工作目录文件夹路径 +let inputDir = getInputDir(); +const previewDir = `${inputDir}/预览图`; +if (!inputDir || !previewDir) { + console.log('未执行裁剪主图功能,工作目录不存在'); + return; +} + +async function reduceImgSize(imgPath, tempImgPath, size) { + let { width } = await sharp(imgPath).metadata(); + if (size > 3 && size < 5) { + console.log('压缩方式1'); + return sharp(imgPath).jpeg({ quality: 90 }).toFile(tempImgPath); + } + + if (size >= 5 && size < 10) { + console.log('压缩方式2'); + return sharp(imgPath) + .resize(width / 1.2) + .jpeg({ quality: 90 }) + .toFile(tempImgPath); + } + if (size >= 10) { + console.log('压缩方式3'); + return sharp(imgPath) + .resize(width / 2) + .jpeg({ quality: 90 }) + .toFile(tempImgPath); + } +} + +fs.readdirSync(previewDir).forEach(async (file) => { + const ext = file.split('.').pop().toLowerCase(); + if (cover.imgFormat.has(ext)) { + const imgPath = path.join(previewDir, file); + + const size = fs.statSync(imgPath).size; + // 将字节转换为 MB + const fileSizeInMB = size / (1024 * 1024); + if (fileSizeInMB > 3) { + const tempImgPath = path.join(previewDir, `${file}_temp`); + reduceImgSize(imgPath, tempImgPath, fileSizeInMB) + .then(() => { + // 处理完后,将临时文件重命名为原始文件 + fs.rename(tempImgPath, imgPath, (err) => { + if (err) { + console.error('重命名失败:', err); + } else { + console.log('压缩图片成功,文件已被覆盖:', imgPath); + } + }); + }) + .catch((err) => { + console.error('发生错误:', err); + }); + } + } +});