node图片自动压缩
图片压缩借用了images、imagemin等第三方库,压缩jpg、Png图片
viteImagemin也可以实现,代码量更加少,squoosh就没用过了
输入需要压缩的文件
//判断是否已经有这个文件路径
function setInputName() {
return new Promise((resolve, reject) => {
inputVlaue.question('请输入需要压缩文件夹名称:', async (val) => {
let asr = val.replace(/\s+/g, "");
if (asr == 'imagesTest') {
console.log("不可以与默认输出文件夹重名");
return setFileName("请重新输入!\n")
} else if (!reg.test(asr)) {
console.log("只能输入英文");
return setFileName("请重新输入!\n")
}
positionDir = path.join(process.cwd(), asr)
console.log(positionDir);
resolve(positionDir)
})
})
}不存在则自动创建文件
不建议在调用 fs.open() 、fs.readFile() 或 fs.writeFile() 之前使用 fs.stat() 检查一个文件是否存在。 作为替代,用户代码应该直接打开/读取/写入文件,当文件无效时再处理错误。
如果要检查一个文件是否存在且不操作它,推荐使用 fs.access()
这里使用node内置path处理文件
function createTimeFile(positionDir) {
let time_PATH = path.resolve(__dirname, positionDir);//获取是否已经存在这个文件
return new Promise((resolve, reject) => {
fs.stat(time_PATH, (err, stat) => {
if (err) {
fs.mkdir(positionDir, { recursive: true }, (err) => {
resolve(err)
console.log(`创建${positionDir}成功!`);
})
} else {
resolve(stat)
}
})
})
}文件创建成功,输入xx指令进行压缩
function ready() {
let msg=`请把所需压缩图片放入${positionDir}输入yes,开始压缩图片!\n`
inputVlaue.question(msg, answers => {
let asr = answers.trim().toLocaleLowerCase()
if (asr == "yes") {
console.log("开始压缩...\n");
setImageData()
} else {
ready("指令错误请重新输入,输入yes开始压缩图片\n")
}
})
}读取需要压缩的文件
//读取需要压缩的文件夹
function getReadFile() {
fs.readdir(positionDir, "utf-8", (err, data) => {
console.log(data.length);
if (data.length == 0) {
console.log("还没有图片,请添加");
}
data.forEach((item, index) => {
let filePath = path.join(positionDir, item)
let filename = filePath.replace(/\\/g, "/");//把 \ 替换为 /
let output = filename.replace(positionDir.replace(/\\/g, "/"), outputDir.replace(/\\/g, "/"));//输出位置
if (path.extname(item) == ".png") {
pngArrayList.push({ filename, output })
} else if (path.extname(item) == ".jpg") {
jpgArrayList.push({ filename, output })
} else if (fs.statSync(filePath).isDirectory()) {
readfile(filePath)
}
})
})
}针对jpg和png处理使用不同的方法
function setImageData() {
if (jpgArrayList.length != 0) {
jpgArrayList = rmSame(jpgArrayList)
//压缩jpg
console.log(jpgArrayList);
jpgArrayList.forEach(item => {
createTimeFile(path.dirname(item.output))
images(item.filename).save(item.output, { quality: 60 })
})
}
//压缩png
pngArrayList = rmSame(pngArrayList)
pngCompress(pngArrayList, pngArrayList.length - 1)
}
function rmSame(arr) {
let newArray = []
let arrObj = []
for (let index = 0; index < arr.length; index++) {
const element = arr;
if (newArray.indexOf(element['filename']) == -1 && (fs.statSync(element['filename']).size > 1024)) {
newArray.push(element['filename'])
arrObj.push(element)
} else if (newArray.indexOf(element['filename']) == -1 && (fs.statSync(element['filename']).size <= 1024)) {
let pathDir = path.dirname(element['output'])
createTimeFile(pathDir)//判断存放压缩的文件夹是否已经存在,不存在则创建
fs.createReadStream(element['filename']).pipe(fs.createWriteStream(element['output']))
console.log(`图片${element['filename']}内存过小,直接转移到${element['output']}`)
}
}
return arrObj
}
//png压缩图片
function pngCompress(arr, index) {
//压缩结束
if (index < 0) {
console.log("\n本窗口在5秒后关闭!")
setTimeout(() => {
inputVlaue.close()
}, 5000)
return
}
let pathDir = path.dirname(arr['output'])
let filename = arr['filename']
createTimeFile(pathDir)
imagemin(, {
destination: pathDir,
plugins: [
imageminPngquant({
quality:
})
]
}).then(() => {
console.log(`图片${filename}压缩完成!`);
pngCompress(arr, index - 1)
}).catch(err => {
console.log(`${arr['filename']}图片压缩不了了,直接转移到${arr['output']}`)
fs.createReadStream(arr['filename']).pipe(fs.createWriteStream(arr['output']))
pngCompress(arr, index - 1)
});
}全部代码
/* * @Author: zlc * @Date: 2022-04-14 16:34:12 * @LastEditTime: 2022-04-15 10:26:16 * @LastEditors: zlc * @Description: 图片压缩 * @FilePath: \git项目\project-template\案例\图片压缩\imagemin\src\app.js */const fs = require("fs")const imagemin = require('imagemin');const imageminPngquant = require('imagemin-pngquant');const path = require("path")const images = require("images")const readline = require("readline");const { resolve } = require("path");const inputVlaue = readline.createInterface({ input: process.stdin, output: process.stdout});let outputDir = path.join(process.cwd(), "imagesTest")let reg = /^+$/let positionDir, timeId, pngArrayList = [], jpgArrayList = []let timeIndex = 0const setCompress = async () => { await setInputName();//输入内容 await createTimeFile(positionDir);//创建文件 await getReadFile()//读取文件 ready()//开始压缩 }//判断是否已经有这个文件路径
function setInputName() {
return new Promise((resolve, reject) => {
inputVlaue.question('请输入需要压缩文件夹名称:', async (val) => {
let asr = val.replace(/\s+/g, "");
if (asr == 'imagesTest') {
console.log("不可以与默认输出文件夹重名");
return setFileName("请重新输入!\n")
} else if (!reg.test(asr)) {
console.log("只能输入英文");
return setFileName("请重新输入!\n")
}
positionDir = path.join(process.cwd(), asr)
console.log(positionDir);
resolve(positionDir)
})
})
}//创建图片文件function createTimeFile(positionDir) {
let time_PATH = path.resolve(__dirname, positionDir);//获取是否已经存在这个文件
return new Promise((resolve, reject) => {
fs.stat(time_PATH, (err, stat) => {
if (err) {
fs.mkdir(positionDir, { recursive: true }, (err) => {
resolve(err)
console.log(`创建${positionDir}成功!`);
})
} else {
resolve(stat)
}
})
})
}//读取需要压缩的文件夹
function getReadFile() {
fs.readdir(positionDir, "utf-8", (err, data) => {
console.log(data.length);
if (data.length == 0) {
console.log("还没有图片,请添加");
}
data.forEach((item, index) => {
let filePath = path.join(positionDir, item)
let filename = filePath.replace(/\\/g, "/");//把 \ 替换为 /
let output = filename.replace(positionDir.replace(/\\/g, "/"), outputDir.replace(/\\/g, "/"));//输出位置
if (path.extname(item) == ".png") {
pngArrayList.push({ filename, output })
} else if (path.extname(item) == ".jpg") {
jpgArrayList.push({ filename, output })
} else if (fs.statSync(filePath).isDirectory()) {
readfile(filePath)
}
})
})
}function ready() {
let msg=`请把所需压缩图片放入${positionDir}输入yes,开始压缩图片!\n`
inputVlaue.question(msg, answers => {
let asr = answers.trim().toLocaleLowerCase()
if (asr == "yes") {
console.log("开始压缩...\n");
setImageData()
} else {
ready("指令错误请重新输入,输入yes开始压缩图片\n")
}
})
}function setImageData() {
if (jpgArrayList.length != 0) {
jpgArrayList = rmSame(jpgArrayList)
//压缩jpg
console.log(jpgArrayList);
jpgArrayList.forEach(item => {
createTimeFile(path.dirname(item.output))
images(item.filename).save(item.output, { quality: 60 })
})
}
//压缩png
pngArrayList = rmSame(pngArrayList)
pngCompress(pngArrayList, pngArrayList.length - 1)
}
function rmSame(arr) {
let newArray = []
let arrObj = []
for (let index = 0; index < arr.length; index++) {
const element = arr;
if (newArray.indexOf(element['filename']) == -1 && (fs.statSync(element['filename']).size > 1024)) {
newArray.push(element['filename'])
arrObj.push(element)
} else if (newArray.indexOf(element['filename']) == -1 && (fs.statSync(element['filename']).size <= 1024)) {
let pathDir = path.dirname(element['output'])
createTimeFile(pathDir)//判断存放压缩的文件夹是否已经存在,不存在则创建
fs.createReadStream(element['filename']).pipe(fs.createWriteStream(element['output']))
console.log(`图片${element['filename']}内存过小,直接转移到${element['output']}`)
}
}
return arrObj
}
//png压缩图片
function pngCompress(arr, index) {
//压缩结束
if (index < 0) {
console.log("\n本窗口在5秒后关闭!")
setTimeout(() => {
inputVlaue.close()
}, 5000)
return
}
let pathDir = path.dirname(arr['output'])
let filename = arr['filename']
createTimeFile(pathDir)
imagemin(, {
destination: pathDir,
plugins: [
imageminPngquant({
quality:
})
]
}).then(() => {
console.log(`图片${filename}压缩完成!`);
pngCompress(arr, index - 1)
}).catch(err => {
console.log(`${arr['filename']}图片压缩不了了,直接转移到${arr['output']}`)
fs.createReadStream(arr['filename']).pipe(fs.createWriteStream(arr['output']))
pngCompress(arr, index - 1)
});
}setCompress()git地址:https://gitee.com/KingSio/project-template/tree/master/
来源:https://www.cnblogs.com/shukesio/p/17761283.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页:
[1]