最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs實(shí)現(xiàn)批量修改圖片尺寸工具

 更新時(shí)間:2024年10月23日 11:24:02   作者:JYeontu  
本文主要為大家介紹了一個(gè)Node.js工具,可以通過簡單的命令行操作,允許用戶批量調(diào)整圖片尺寸,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

代碼實(shí)現(xiàn)

1.依賴引入

(1)@jyeontu/j-inquirer

@jyeontu/j-inquirer 是一個(gè) Node.js 的命令行交互模塊,它可以方便地創(chuàng)建一個(gè)交互式命令行界面,用于與用戶進(jìn)行交互。它提供了多種常見的輸入方式,如單選、多選、輸入框、文件選擇、目錄選擇等等,并且可以自定義提示信息、選項(xiàng)等。

(2)@jyeontu/progress-bar

@jyeontu/progress-bar 是一個(gè) Node.js 的進(jìn)度條模塊,它可以在命令行中展示一個(gè)進(jìn)度條,用于顯示正在進(jìn)行的操作的進(jìn)度。它支持多種樣式和配置選項(xiàng),可以根據(jù)需要調(diào)整進(jìn)度條的樣式、長度、顏色等等。

(3)fs-extra

擴(kuò)展了Node.js的fs模塊,它提供了多種操作文件和目錄的方法,如讀取文件、寫入文件、創(chuàng)建目錄、刪除文件等等。在 Node.js 中,我們可以使用 fs-extra 模塊來讀取和處理本地的文件。

(4)jimp

jimp 是一個(gè)純 JavaScript 的圖像處理庫,它可以用于處理各種類型的圖片,如 PNG、JPEG、BMP 等等。它提供了多種圖像處理方法,如調(diào)整大小、裁剪、旋轉(zhuǎn)、添加水印等等,可以輕松地實(shí)現(xiàn)各種圖像處理需求。在 Node.js 中,我們可以使用 jimp 來讀取和處理本地的圖片文件。

2.命令行交互獲取處理參數(shù)

(1)單張圖片或批量

詢問用戶是要處理單個(gè)圖片還是一個(gè)圖片文件夾

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ù)用戶選擇的類型(單個(gè)圖片或文件夾),詢問用戶選擇圖片或文件夾的路徑,并詢問調(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 "請輸入一個(gè)有效的數(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 "請輸入一個(gè)有效的數(shù)字"; // 輸入無效
          }
        },
      },
      {
        type: "input",
        message: "請輸入高度",
        name: "height",
        default: "720",
        validate: function (input) {
          const isNumber = !isNaN(input) && !isNaN(parseFloat(input));
          if (isNumber) {
            return true; // 輸入有效
          } else {
            return "請輸入一個(gè)有效的數(shù)字"; // 輸入無效
          }
        },
      }
    );
  }
  const answers = await new inquirer(options).prompt();
  return answers;
}

3.計(jì)算調(diào)整后圖片分辨率

根據(jù)用戶輸入的參數(shù),計(jì)算出調(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:這是一個(gè)Jimp對象,代表了加載的圖片,包含了圖片的原始寬度和高度信息。
  • params:這是一個(gè)對象,包含了用戶通過命令行交互指定的調(diào)整參數(shù),主要有:
    • adjustType:用戶選擇的調(diào)整類型,可以是"按比例"或"自定義寬高"。
    • referenceEdge:如果用戶選擇按比例調(diào)整,這個(gè)屬性指定了參考邊是"寬"還是"高"。
    • referenceEdgeLength:用戶輸入的基準(zhǔn)邊長度。
    • widthheight:如果用戶選擇自定義寬高,這兩個(gè)屬性會包含用戶輸入的寬度和高度值。

函數(shù)邏輯:

  • 函數(shù)首先從bitmap對象中解構(gòu)出原始的width(寬度)和height(高度)。

  • 接下來,根據(jù)params.adjustType的值來判斷用戶選擇的調(diào)整類型:

    • 如果是"按比例"("按比例"),則進(jìn)一步檢查params.referenceEdge的值:
      • 如果參考邊是"寬"("寬"),則計(jì)算新的寬度為用戶指定的基準(zhǔn)邊長度params.referenceEdgeLength,然后根據(jù)原始高度和新寬度的比例計(jì)算新的height。
      • 如果參考邊是"高"("高"),則計(jì)算新的height為用戶指定的基準(zhǔn)邊長度,然后計(jì)算新的width。
    • 如果用戶選擇的是"自定義寬高"(非"按比例"),則直接將用戶指定的params.widthparams.height作為新的寬度和高度。
  • 在計(jì)算出新的寬度和高度后,函數(shù)通過width -= 0;height -= 0;將數(shù)值轉(zhuǎn)換為數(shù)字類型,以確保它們是數(shù)字而不是字符串。這是因?yàn)橛脩糨斎肟赡軙划?dāng)作字符串處理,而在進(jìn)行數(shù)學(xué)計(jì)算時(shí)需要確保它們是數(shù)字類型。

  • 最后,函數(shù)返回一個(gè)包含新widthheight的對象。

注意:

這個(gè)函數(shù)中的width -= 0;height -= 0;是一種類型轉(zhuǎn)換的技巧,它利用了JavaScript的類型轉(zhuǎn)換規(guī)則,將變量轉(zhuǎn)換為數(shù)字類型。這種轉(zhuǎn)換通常不是必須的,因?yàn)閺?code>bitmap對象中直接解構(gòu)出來的widthheight應(yīng)該已經(jīng)是數(shù)字類型了。如果params.widthparams.height是從用戶輸入解析得到的,并且確定用戶輸入的是有效的數(shù)字,這兩個(gè)轉(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實(shí)現(xiàn)批量修改圖片尺寸工具的詳細(xì)內(nèi)容,更多關(guān)于Nodejs批量修改圖片尺寸的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Node的stream數(shù)據(jù)流你了解嗎

    Node的stream數(shù)據(jù)流你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Node的stream數(shù)據(jù)流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作示例

    node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作示例

    這篇文章主要介紹了node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作,結(jié)合實(shí)例形式分析了node.js http服務(wù)器與瀏覽器之間的內(nèi)容緩存原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-02-02
  • Node中fs文件系統(tǒng)模塊的使用方法詳解

    Node中fs文件系統(tǒng)模塊的使用方法詳解

    fs?模塊是?Node.js?官方提供的、用來操作文件的模塊(內(nèi)置api),它提供了一系列的方法和屬性,用來滿足用戶對文件的操作需求,本文給大家介紹了Node中fs文件系統(tǒng)模塊的使用方法,需要的朋友可以參考下
    2024-03-03
  • Node.js的環(huán)境安裝配置(使用nvm方式)

    Node.js的環(huán)境安裝配置(使用nvm方式)

    在我們前端開發(fā)工程中,很多繁瑣機(jī)械的操作都是會慢慢的被抽離出來的,比如當(dāng)我們?yōu)閐om操作和瀏覽器兼容性感到厭煩時(shí),jQuery出現(xiàn)了,隨著時(shí)間的發(fā)展,JavaScript現(xiàn)在被應(yīng)用到了服務(wù)器中,但是首先第一步我們要學(xué)會如何安裝配置Node.js的環(huán)境,本文是使用nvm方式,來一起看看。
    2016-10-10
  • 詳解如何查看node端口被占用并殺死

    詳解如何查看node端口被占用并殺死

    這篇文章主要給大家介紹了如何查看node端口被占用并殺死,文中給出了相關(guān)的解決方法,并通過代碼示例給大家介紹的非常詳細(xì),對前端開發(fā)要學(xué)會如何查看端口占用并殺死非常有用,需要的朋友可以參考下
    2024-01-01
  • 淺談Node模塊系統(tǒng)及其模式

    淺談Node模塊系統(tǒng)及其模式

    本篇文章主要介紹了淺談Node模塊系統(tǒng)及其模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 使用PM2實(shí)現(xiàn)高效的應(yīng)用監(jiān)控與管理功能

    使用PM2實(shí)現(xiàn)高效的應(yīng)用監(jiān)控與管理功能

    PM2?是一個(gè)流行的進(jìn)程管理器,用于?Node.js?應(yīng)用程序,它支持應(yīng)用程序的負(fù)載均衡、自動重啟、日志管理、監(jiān)控以及多環(huán)境管理等功能,本文給大家介紹了如何使用PM2實(shí)現(xiàn)高效的應(yīng)用監(jiān)控與管理功能,需要的朋友可以參考下
    2024-02-02
  • express結(jié)合nodejs開啟服務(wù)示例模版

    express結(jié)合nodejs開啟服務(wù)示例模版

    這篇文章主要為大家展現(xiàn)了express結(jié)合nodejs開啟服務(wù)的代碼示例模版,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted)

    Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not

    這篇文章主要介紹了Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Nest.js環(huán)境變量配置與序列化詳解

    Nest.js環(huán)境變量配置與序列化詳解

    這篇文章主要給大家介紹了關(guān)于Nest.js環(huán)境變量配置與序列化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

深州市| 明溪县| 任丘市| 库尔勒市| 乌拉特前旗| 崇信县| 巴彦县| 乐清市| 康平县| 峨眉山市| 台江县| 乳源| 修文县| 蓬溪县| 孟州市| 临夏市| 新泰市| 大化| 资中县| 耒阳市| 长岭县| 寿宁县| 芦溪县| 临朐县| 广河县| 射洪县| 客服| 平远县| 宣武区| 筠连县| 始兴县| 临颍县| 承德市| 普安县| 格尔木市| 时尚| 玛纳斯县| 周至县| 安溪县| 阜康市| 太湖县|