From 2dca793fa4314f6f9b899d7df943846f9c559e34 Mon Sep 17 00:00:00 2001 From: LCJ-MinYa <1049468118@qq.com> Date: Thu, 7 Nov 2024 17:57:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=8E=8B=E7=BC=A9=E5=9B=BE?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/product_cover_img.js | 5 +++++ src/reduce_img_size.js | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/reduce_img_size.js 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..8658201 --- /dev/null +++ b/src/reduce_img_size.js @@ -0,0 +1,36 @@ +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) { + let { width } = await sharp(imgPath).metadata(); + const size = fs.statSync(imgPath).size; + const fileSizeInMB = size / (1024 * 1024); // 将字节转换为 MB + console.log(width, fileSizeInMB); + // .resize(800) // 调整图片宽度为 800 像素 + // .jpeg({ quality: 80 }) // 设置 JPEG 格式的质量为 80% + // .toFile('output.jpg', (err, info) => { + // if (err) throw err; + // console.log('图片已成功压缩:', info); + // }); +} + +fs.readdirSync(previewDir).forEach(async (file) => { + const ext = file.split('.').pop().toLowerCase(); + if (cover.imgFormat.has(ext)) { + const imgPath = path.join(previewDir, file); + const tempImgPath = path.join(previewDir, `${file}_temp`); + + reduceImgSize(imgPath, tempImgPath); + } +}); From e20727378c229020be6f1630c8f90b00009b8a0a Mon Sep 17 00:00:00 2001 From: LCJ-MinYa <1049468118@qq.com> Date: Fri, 8 Nov 2024 11:55:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E5=8E=8B=E7=BC=A9=E5=9B=BE?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/reduce_img_size.js | 52 ++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/src/reduce_img_size.js b/src/reduce_img_size.js index 8658201..ca17f77 100644 --- a/src/reduce_img_size.js +++ b/src/reduce_img_size.js @@ -12,25 +12,53 @@ if (!inputDir || !previewDir) { return; } -async function reduceImgSize(imgPath, tempImgPath) { +async function reduceImgSize(imgPath, tempImgPath, size) { let { width } = await sharp(imgPath).metadata(); - const size = fs.statSync(imgPath).size; - const fileSizeInMB = size / (1024 * 1024); // 将字节转换为 MB - console.log(width, fileSizeInMB); - // .resize(800) // 调整图片宽度为 800 像素 - // .jpeg({ quality: 80 }) // 设置 JPEG 格式的质量为 80% - // .toFile('output.jpg', (err, info) => { - // if (err) throw err; - // console.log('图片已成功压缩:', info); - // }); + 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 tempImgPath = path.join(previewDir, `${file}_temp`); - reduceImgSize(imgPath, tempImgPath); + 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); + }); + } } });