node图片自动压缩

这篇具有很好参考价值的文章主要介绍了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[index];
        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[index]['output'])
    let filename = arr[index]['filename']
    createTimeFile(pathDir)
    imagemin([filename], {
        destination: pathDir,
        plugins: [
            imageminPngquant({
                quality: [0.6, 0.7]
            })
        ]
    }).then(() => {
        console.log(`图片${filename}压缩完成!`);
        pngCompress(arr, index - 1)
    }).catch(err => {
        console.log(`${arr[index]['filename']}图片压缩不了了,直接转移到${arr[index]['output']}`)
        fs.createReadStream(arr[index]['filename']).pipe(fs.createWriteStream(arr[index]['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 = /^[a-zA-Z]+$/

let positionDir, timeId, pngArrayList = [], jpgArrayList = []
let timeIndex = 0
const 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[index];
        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[index]['output'])
    let filename = arr[index]['filename']
    createTimeFile(pathDir)
    imagemin([filename], {
        destination: pathDir,
        plugins: [
            imageminPngquant({
                quality: [0.6, 0.7]
            })
        ]
    }).then(() => {
        console.log(`图片${filename}压缩完成!`);
        pngCompress(arr, index - 1)
    }).catch(err => {
        console.log(`${arr[index]['filename']}图片压缩不了了,直接转移到${arr[index]['output']}`)
        fs.createReadStream(arr[index]['filename']).pipe(fs.createWriteStream(arr[index]['output']))
        pngCompress(arr, index - 1)
    });

}
setCompress()

git地址:https://gitee.com/KingSio/project-template/tree/master/文章来源地址https://www.toymoban.com/news/detail-710657.html

到了这里,关于node图片自动压缩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用了这么久 IDEA ,你竟然不知道有个功能叫自动补全!

    来源: https://dwz.cn/hlQEDFne IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。 这个功能可以使用代码补全来模板式地补全语句,如遍历循环语句(for、foreach)、使用 String.format() 包裹一个字符串、使用类型转化包裹一个

    2024年02月08日
    浏览(39)
  • node.js文件的压缩解压

    第一步先要弄清楚为什么需要压缩和解压文件,这是因为文件太大了,我们需要将文件进行压缩,既然压缩了。后期就需要对其进行解压缩。我们要考虑最坏的打算,文件过于大,电脑内存没办法一步获取并且存储这么大的文件,所以我们需要使用到流式的方法来处理文件。

    2024年02月02日
    浏览(38)
  • 如何压缩jpg图片kb大小?在线图片压缩工具推荐

    如果在编辑文稿的时候,使用太多这些高分辨率的图片,文稿的体积也会变得很大,这样子不仅打开文稿会比较耗时,传输文稿的时候,也不太方便,这时候就需要图片压缩一下,那么如何实现jpg压缩(https://www.yasuotu.com/jpg)呢?下面推荐一个压缩jpg工具,一起来了解一下吧

    2023年04月08日
    浏览(76)
  • 怎么用手机压缩图片?教给大家三种手机压缩图片方法

    如何使用手机把图片的内存进行压缩呢?大家在使用照片的时候,如果照片的内存太大,不仅会占用手机的内存,也会影响一些网站上传图片的操作,因为图片内存太大很多都是上传不了的,为了解决这一问题我们可以将图片进行压缩。今天给大家分享三种手机就能压缩图片

    2024年02月08日
    浏览(43)
  • python压缩图片--指定压缩大小且保真压缩

    循环降低图片质量quality 直至图片质量大小符合目标质量后退出循环 pillow处理后和原图片的对比 使用pillow压缩的图片不单止大小质量没达标而且处理后的图片失真不忍直视。 opencv处理后和原图片的对比 想用python压缩图片然后网上搜,搜索结果90%都是python使用pillow的压缩。最

    2024年02月11日
    浏览(54)
  • 图片怎么压缩到200K以内,这3个图片压缩方法,简单有效

    你没有遇到过上传图片到网站的时候,图片太大不能上传的情况?还有,许多报名照片要求小于200K,可是照片超过这个大小,应该如何压缩呢?下面我给大家带来3个图片压缩的方法,既能快速压缩图片大小,又保存画质清晰。 方法一:用画图工具压缩 1、对着需要压缩的图

    2023年04月24日
    浏览(75)
  • Android-图片压缩(二)- 压缩基础

    Android - 图片压缩(一)- 项目中取图片转bitmap Android - 图片压缩(二)- 压缩基础 Android - 图片压缩(三)- 剖析鲁班,借鉴参数 Android - 图片压缩(四)- 手撸压缩工具 Android - 图片压缩(五)- 推广使用,开始属于你的工具库 前言:让我们手撸一个图片压缩库,对压缩工具鲁

    2024年02月02日
    浏览(53)
  • 小程序使用Image对象预加载图片·获取图片信息

    微信和支付宝等小程序目前都没有直接调用Image的接口, 但可以借用canvas曲线救国,在页面设置个不可见的canvas,再通过canvas的接口能力就能调用到image了 微信案例 支付宝案例 微信小程序开发文档·canvas 支付宝小程序开发文档·canvas

    2024年02月06日
    浏览(36)
  • uniapp 上传图片时压缩图片

    提示:这里简述项目相关背景: 最近用uniapp做一个上传图片,要把图片大小压缩到200kb,然后传给后端 image-conversion:一个简单易用的JS图像转换工具,可以指定大小以压缩图像 npm i image-conversion --save const imageConversion = require(“@/components/image-conversion”);

    2024年02月12日
    浏览(37)
  • Vue3图片(Image)

    本图片预览组件主要包括以下功能: 展示图片时,可设置鼠标悬浮时的预览文本;图像无法加载时要显示的描述;自定义图像高度和宽度;设置图像如何适应容器高度和宽度( fill(填充) | contain(等比缩放包含) | cover(等比缩放覆盖));传入单张图像或图像数组;设置图像缩放

    2024年02月01日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包