Nodejs實現(xiàn)批量修改圖片尺寸工具
代碼實現(xiàn)
1.依賴引入
(1)@jyeontu/j-inquirer
@jyeontu/j-inquirer 是一個 Node.js 的命令行交互模塊,它可以方便地創(chuàng)建一個交互式命令行界面,用于與用戶進行交互。它提供了多種常見的輸入方式,如單選、多選、輸入框、文件選擇、目錄選擇等等,并且可以自定義提示信息、選項等。
(2)@jyeontu/progress-bar
@jyeontu/progress-bar 是一個 Node.js 的進度條模塊,它可以在命令行中展示一個進度條,用于顯示正在進行的操作的進度。它支持多種樣式和配置選項,可以根據(jù)需要調(diào)整進度條的樣式、長度、顏色等等。
(3)fs-extra
擴展了Node.js的fs模塊,它提供了多種操作文件和目錄的方法,如讀取文件、寫入文件、創(chuàng)建目錄、刪除文件等等。在 Node.js 中,我們可以使用 fs-extra 模塊來讀取和處理本地的文件。
(4)jimp
jimp 是一個純 JavaScript 的圖像處理庫,它可以用于處理各種類型的圖片,如 PNG、JPEG、BMP 等等。它提供了多種圖像處理方法,如調(diào)整大小、裁剪、旋轉(zhuǎn)、添加水印等等,可以輕松地實現(xiàn)各種圖像處理需求。在 Node.js 中,我們可以使用 jimp 來讀取和處理本地的圖片文件。
2.命令行交互獲取處理參數(shù)
(1)單張圖片或批量
詢問用戶是要處理單個圖片還是一個圖片文件夾
async function askForSingleOrBatch() { const options = [ { type: "list", message: "選擇文件夾還是單張圖片", name: "imgType", default: "單張圖片", choices: ["文件夾", "單張圖片"], }, ]; const answers = await new inquirer(options).prompt(); const { imgType } = answers; return imgType; }
(2)獲取圖片路徑
根據(jù)用戶選擇的類型(單個圖片或文件夾),詢問用戶選擇圖片或文件夾的路徑,并詢問調(diào)整尺寸的方式。
async function askForParams(imgType) { const options = []; if (imgType === "文件夾") { options.push({ type: "folder", message: "請選擇圖片目錄", name: "imgFolder", default: "", dirname: baseDir, }); } else { options.push({ type: "file", message: "請選擇圖片", name: "img", default: "", dirname: baseDir, }); } options.push({ type: "list", message: "調(diào)整類型", name: "adjustType", default: "按比例", choices: ["按比例", "自定義寬高"], }); const answers = await new inquirer(options).prompt(); return answers; }
(3)獲取具體調(diào)整參數(shù)
根據(jù)用戶選擇的調(diào)整方式,詢問用戶具體的調(diào)整參數(shù)。
async function askForImgParams(adjustType) { const options = []; if (adjustType === "按比例") { options.push( { type: "list", message: "請選擇基準(zhǔn)邊", name: "referenceEdge", default: "寬", choices: ["寬", "高"], }, { type: "input", message: "請輸入基準(zhǔn)邊長度", name: "referenceEdgeLength", default: "800", validate: function (input) { const isNumber = !isNaN(input) && !isNaN(parseFloat(input)); if (isNumber) { return true; // 輸入有效 } else { return "請輸入一個有效的數(shù)字"; // 輸入無效 } }, } ); } else { options.push( { type: "input", message: "請輸入寬度", name: "width", default: "1280", validate: function (input) { const isNumber = !isNaN(input) && !isNaN(parseFloat(input)); if (isNumber) { return true; // 輸入有效 } else { return "請輸入一個有效的數(shù)字"; // 輸入無效 } }, }, { type: "input", message: "請輸入高度", name: "height", default: "720", validate: function (input) { const isNumber = !isNaN(input) && !isNaN(parseFloat(input)); if (isNumber) { return true; // 輸入有效 } else { return "請輸入一個有效的數(shù)字"; // 輸入無效 } }, } ); } const answers = await new inquirer(options).prompt(); return answers; }
3.計算調(diào)整后圖片分辨率
根據(jù)用戶輸入的參數(shù),計算出調(diào)整后的圖片寬度和高度。
function getWidthAndHeight(bitmap, params) { let { width, height } = bitmap; if (params.adjustType === "按比例") { if (params.referenceEdge === "寬") { const rate = params.referenceEdgeLength / width; width = params.referenceEdgeLength; height = height * rate; } else { const rate = params.referenceEdgeLength / height; height = params.referenceEdgeLength; width = width * rate; } } else { width = params.width; height = params.height; } width -= 0; height -= 0; return { width, height }; }
參數(shù)解釋:
bitmap
:這是一個Jimp對象,代表了加載的圖片,包含了圖片的原始寬度和高度信息。params
:這是一個對象,包含了用戶通過命令行交互指定的調(diào)整參數(shù),主要有:adjustType
:用戶選擇的調(diào)整類型,可以是"按比例"或"自定義寬高"。referenceEdge
:如果用戶選擇按比例調(diào)整,這個屬性指定了參考邊是"寬"還是"高"。referenceEdgeLength
:用戶輸入的基準(zhǔn)邊長度。width
和height
:如果用戶選擇自定義寬高,這兩個屬性會包含用戶輸入的寬度和高度值。
函數(shù)邏輯:
函數(shù)首先從
bitmap
對象中解構(gòu)出原始的width
(寬度)和height
(高度)。接下來,根據(jù)
params.adjustType
的值來判斷用戶選擇的調(diào)整類型:- 如果是"按比例"(
"按比例"
),則進一步檢查params.referenceEdge
的值:- 如果參考邊是"寬"(
"寬"
),則計算新的寬度為用戶指定的基準(zhǔn)邊長度params.referenceEdgeLength
,然后根據(jù)原始高度和新寬度的比例計算新的height
。 - 如果參考邊是"高"(
"高"
),則計算新的height
為用戶指定的基準(zhǔn)邊長度,然后計算新的width
。
- 如果參考邊是"寬"(
- 如果用戶選擇的是"自定義寬高"(非"按比例"),則直接將用戶指定的
params.width
和params.height
作為新的寬度和高度。
- 如果是"按比例"(
在計算出新的寬度和高度后,函數(shù)通過
width -= 0;
和height -= 0;
將數(shù)值轉(zhuǎn)換為數(shù)字類型,以確保它們是數(shù)字而不是字符串。這是因為用戶輸入可能會被當(dāng)作字符串處理,而在進行數(shù)學(xué)計算時需要確保它們是數(shù)字類型。最后,函數(shù)返回一個包含新
width
和height
的對象。
注意:
這個函數(shù)中的width -= 0;
和height -= 0;
是一種類型轉(zhuǎn)換的技巧,它利用了JavaScript的類型轉(zhuǎn)換規(guī)則,將變量轉(zhuǎn)換為數(shù)字類型。這種轉(zhuǎn)換通常不是必須的,因為從bitmap
對象中直接解構(gòu)出來的width
和height
應(yīng)該已經(jīng)是數(shù)字類型了。如果params.width
和params.height
是從用戶輸入解析得到的,并且確定用戶輸入的是有效的數(shù)字,這兩個轉(zhuǎn)換語句可以省略。
4.獲取修改后圖片輸出路徑
根據(jù)用戶選擇的圖片或文件夾路徑,生成輸出目錄的路徑,如果路徑不存在則創(chuàng)建該目錄。
async function getOutPutDir(img) { const pathName = img.split("\\"); const name = pathName.pop(); pathName.push("resizeImgOutPut"); const outputPath = pathName.join("\\"); if (!fs.existsSync(outputPath)) { fs.mkdirSync(outputPath); } pathName.push(name); return pathName.join("\\"); }
5.定義圖片處理函數(shù)
(1)單張圖片
async function resizeImg(params) { const outputPath = await getOutPutDir(params.img); const image = await Jimp.read(params.img); const { width, height } = getWidthAndHeight(image.bitmap, params); const newSizeImage = image.resize(width, height); newSizeImage.write(outputPath); }
(2)圖片目錄
async function resizeDir(params) { const imgList = fs.readdirSync(params.imgFolder); for (let i = 0; i < imgList.length; i++) { if (imgList[i].match(/\.(jpg|jpeg|png|bmp|tiff|gif)$/i)) { await resizeImg({ ...params, img: params.imgFolder + "\\" + imgList[i], }); } } }
快速使用
安裝
該工具已經(jīng)發(fā)布到npm上,可以在命令行快速安裝:
npm install -g jyeontu
功能選擇
jyeontu img
選擇調(diào)整圖片尺寸,然后按提示輸入或選擇即可。
以上就是Nodejs實現(xiàn)批量修改圖片尺寸工具的詳細(xì)內(nèi)容,更多關(guān)于Nodejs批量修改圖片尺寸的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Node.js中exports和module.exports的區(qū)別
這篇文章主要介紹了詳解Node.js中exports和module.exports的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04在Mac OS上安裝使用Node.js的項目自動化構(gòu)建工具Gulp
Gulp是一個在使用上比Grunt更加簡潔的自動化工具(文中附有對比),和Node的npm包管理器配合使用非常方便,下面就記錄一下在Mac OS上安裝使用Node.js的項目自動化構(gòu)建工具Gulp的方法:2016-06-06nodejs實現(xiàn)郵件發(fā)送服務(wù)實例分享
本文給大家講解的是簡單的使用nodejs搭建郵件發(fā)送服務(wù)的一個實例,非常的好用,有需要的小伙伴可以參考下2017-03-03nodejs 使用nodejs-websocket模塊實現(xiàn)點對點實時通訊
這篇文章主要介紹了nodejs 使用nodejs-websocket模塊實現(xiàn)點對點實時通訊的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11Node.js中MongoDB查詢數(shù)據(jù)的方法
在Node.js中,可以使用MongoDB驅(qū)動程序和Mongoose庫來進行MongoDB的查詢操作,本文就來介紹一下Node.js中MongoDB查詢數(shù)據(jù)的方法,感興趣的可以了解一下2023-12-12