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

使用Node.js插件給指定目錄下的所有圖片添加上文字水印

 更新時間:2023年12月22日 08:42:23   作者:JYeontu  
加水印是為了保護(hù)圖片的版權(quán)和安全,在互聯(lián)網(wǎng)上,很容易將圖片下載或者截屏保存下來,然后進(jìn)行二次使用,這就侵犯了原作者的版權(quán),此外,水印也可以幫助識別圖片的來源和所有者,因此本文給大家介紹了如何使用Node.js插件給指定目錄下的所有圖片添加上文字水印

說在前面

加水印是為了保護(hù)圖片的版權(quán)和安全。在互聯(lián)網(wǎng)上,很容易將圖片下載或者截屏保存下來,然后進(jìn)行二次使用,這就侵犯了原作者的版權(quán)。而加上水印可以使得圖片更難被盜用,因為盜用者需要花費時間和精力去處理水印,而這個過程可能會破壞原始圖片的質(zhì)量。

此外,水印也可以幫助識別圖片的來源和所有者。如果一張圖片被惡意使用或者未經(jīng)授權(quán)的使用,通過水印可以追蹤到圖片的來源和版權(quán)所有人,從而維護(hù)原作者的權(quán)益。

因此,加水印對于保護(hù)圖片的版權(quán)和安全具有重要意義。

代碼實現(xiàn)

1、依賴引入

(1)@jyeontu/j-inquirer

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

(2)@jyeontu/progress-bar

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

(3)fs

fs 是 Node.js 內(nèi)置的文件系統(tǒng)模塊,它提供了多種操作文件和目錄的方法,如讀取文件、寫入文件、創(chuàng)建目錄、刪除文件等等。在 Node.js 中,我們可以使用 fs 模塊來讀取和處理本地的文件。

(4)jimp

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

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

const textWaterMarkOptions = [
  {
    type: "folder",
    message: "請選擇需要添加水印的圖片目錄",
    name: "inputFolder",
    default: "",
    dirname: baseDir,
  },
  {
    type: "input",
    message: "請輸入水印文字",
    name: "watermarkText",
    default: "",
  },
  {
    type: "list",
    message: "請選擇水印位置",
    name: "watermarkPos",
    default: "center",
    choices: [
      "上左",
      "上中",
      "上右",
      "中左",
      "正中",
      "中右",
      "下左",
      "下中",
      "下右",
    ],
  },
];
async function ask(options) {
  const answers = await new inquirer(options).prompt();
  return answers;
}
async function textWaterMark(inputFolder, outputFolder) {
  const { watermarkText, watermarkPos } = await ask(textWaterMarkOptions);
  …………
}

獲取用戶需要添加水印的目錄、水印文字內(nèi)容及水印添加位置。

3、圖片添加水印

(1)獲取目錄下的所有圖片

const IMG_TYPE = ["jpg", "png", "jpeg"];
function checkImgType(file) {
  const tmp = file.split(".");
  return IMG_TYPE.includes(tmp[tmp.length - 1].toLocaleLowerCase());
}

const imageFiles = fs
.readdirSync(inputFolder)
.filter((file) => checkImgType(file));

目前支持處理"jpg", "png", "jpeg"類型的圖片文件,獲取指定目錄下的符合類型的所有圖片文件。

(2)水印位置計算

function getPosition(img, waterMark, pos) {
  const imageWidth = img.width;
  const imageHeight = img.height;
  const watermarkWidth = waterMark.width;
  const watermarkHeight = waterMark.height;
  let x = (imageWidth - watermarkWidth) / 2; // 水印橫坐標(biāo)
  let y = (imageHeight - watermarkHeight) / 2; // 水印縱坐標(biāo)

  switch (pos) {
    case "上左":
      x = 10; // 水印橫坐標(biāo)
      y = 10; // 水印縱坐標(biāo)
      break;
    case "上中":
      x = (imageWidth - watermarkWidth) / 2; // 水印橫坐標(biāo)
      y = 10; // 水印縱坐標(biāo)
      break;
    case "上右":
      x = imageWidth - watermarkWidth - 20; // 水印橫坐標(biāo)
      y = 10; // 水印縱坐標(biāo)
      break;
    case "中左":
      x = 10; // 水印橫坐標(biāo)
      y = (imageHeight - watermarkHeight) / 2; // 水印縱坐標(biāo)
      break;
    case "正中":
      x = (imageWidth - watermarkWidth) / 2; // 水印橫坐標(biāo)
      y = (imageHeight - watermarkHeight) / 2; // 水印縱坐標(biāo)
      break;
    case "中右":
      x = imageWidth - watermarkWidth - 20; // 水印橫坐標(biāo)
      y = (imageHeight - watermarkHeight) / 2; // 水印縱坐標(biāo)
      break;
    case "下左":
      x = 10; // 水印橫坐標(biāo)
      y = imageHeight - watermarkHeight - 20; // 水印縱坐標(biāo)
      break;
    case "下中":
      x = (imageWidth - watermarkWidth) / 2; // 水印橫坐標(biāo)
      y = imageHeight - watermarkHeight - 20; // 水印縱坐標(biāo)
      break;
    case "下右":
      x = imageWidth - watermarkWidth - 20; // 水印橫坐標(biāo)
      y = imageHeight - watermarkHeight - 20; // 水印縱坐標(biāo)
      break;
  }
  return {
    x,
    y,
  };
}

(3)添加文字水印

使用 jimp 模塊讀取輸入圖片,根據(jù)水印文字和位置參數(shù)創(chuàng)建水印圖層,并與原始圖片進(jìn)行合成,最后保存處理后的圖片到輸出路徑。具體說明已在下面代碼中注釋。

async function addWaterMark(
  inputFilePath,
  outputFilePath,
  watermarkText,
  watermarkPos,
  textconfig = {}
) {
//接收五個參數(shù):`inputFilePath`(輸入圖片文件路徑)、`outputFilePath`(輸出圖片文件路徑)、`watermarkText`(水印文字內(nèi)容)、`watermarkPos`(水印位置)、`textconfig`(文本配置,可選)。
  textOptions.text = watermarkText;
  for (const k in textconfig) {
    textOptions[k] = textconfig[k];
  }
  // 使用 `Jimp.read` 方法讀取輸入圖片文件,并使用 `Jimp.loadFont` 方法加載字體文件
  const image = await Jimp.read(inputFilePath);
  const font = await Jimp.loadFont(Jimp.FONT_SANS_16_WHITE);

  // 獲取輸入圖片和水印的寬度和高度,使用 `Jimp.measureText` 方法測量水印文字的寬度,使用 `Jimp.measureTextHeight` 方法測量水印文字的高度。
  const imageWidth = image.getWidth();
  const imageHeight = image.getHeight();
  const watermarkWidth = Jimp.measureText(font, watermarkText);
  const watermarkHeight = Jimp.measureTextHeight(
    font,
    watermarkText,
    watermarkWidth
  );

  // 調(diào)用 `getPosition` 函數(shù)計算水印放置的位置,根據(jù)輸入圖片和水印的尺寸以及水印位置參數(shù) `watermarkPos`。
  const { x, y } = getPosition(
    {
      height: imageHeight,
      width: imageWidth,
    },
    { height: watermarkHeight, width: watermarkWidth },
    watermarkPos
  );

  // 創(chuàng)建一個新的 `Jimp` 對象作為背景圖層,寬度為水印寬度加上 20 像素,高度為水印高度加上 20 像素,并設(shè)置背景顏色為半透明黑色(0x00000030)
  const background = new Jimp(
    watermarkWidth + 20,
    watermarkHeight + 20,
    0x00000030
  ); // 0x00000080 表示半透明黑色背景

  // 將水印文字打印到背景圖層上,使用指定的字體、起始坐標(biāo)(10, 10)、文本配置 `textOptions`,并指定水印文字的寬度和高度。
  background.print(font, 10, 10, textOptions, watermarkWidth, watermarkHeight);

  // 將背景圖層與原始圖片進(jìn)行合成,使用指定的合成模式 `Jimp.BLEND_SOURCE_OVER`。
  image.composite(background, x, y, { mode: Jimp.BLEND_SOURCE_OVER });

  // 將處理后的圖片保存到輸出圖片文件路徑 `outputFilePath`。
  await image.writeAsync(outputFilePath);
}

以上就是使用Node.js插件給指定目錄下的所有圖片添加上文字水印的詳細(xì)內(nèi)容,更多關(guān)于Node.js給目錄下圖片添加水印的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • nodejs配置express服務(wù)器運行自動打開瀏覽器詳細(xì)步驟

    nodejs配置express服務(wù)器運行自動打開瀏覽器詳細(xì)步驟

    在nodejs中使用express來搭建框架可以說是非常的簡單方便,下面這篇文章主要給大家介紹了關(guān)于nodejs配置express服務(wù)器運行自動打開瀏覽器的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Node.js連接MongoDB數(shù)據(jù)庫產(chǎn)生的問題

    Node.js連接MongoDB數(shù)據(jù)庫產(chǎn)生的問題

    Node.js是使用JavaScript 編寫的可以運行在服務(wù)端的JS語言。node.js和mongodb碰撞會產(chǎn)生一系列問題,下面通過本文給大家分享Node.js連接MongoDB數(shù)據(jù)庫,需要的的朋友參考下
    2017-02-02
  • 詳解node child_process模塊學(xué)習(xí)筆記

    詳解node child_process模塊學(xué)習(xí)筆記

    這篇文章主要介紹了詳解node child_process模塊學(xué)習(xí)筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 使用Node.js實現(xiàn)Word文檔差異比較并高亮標(biāo)注工具

    使用Node.js實現(xiàn)Word文檔差異比較并高亮標(biāo)注工具

    這篇文章主要介紹了一個使用Node.js編寫的智能Word文檔差異比對工具,通過解析、比較和生成Word文檔,實現(xiàn)自動識別文本差異、智能標(biāo)注修改痕跡并生成專業(yè)比對報告,感興趣的小伙伴跟著小編一起來看看吧
    2025-04-04
  • 完整地Docker化Node.js項目的部署流程

    完整地Docker化Node.js項目的部署流程

    在現(xiàn)代微服務(wù)架構(gòu)中,將 Node.js 應(yīng)用容器化可以方便部署、管理和擴(kuò)展,本文將展示如何完整地 Docker 化 Node.js 項目,并提供一個一鍵部署腳本,需要的朋友可以參考下
    2025-10-10
  • express框架通過ejs模板渲染輸出頁面實例分析

    express框架通過ejs模板渲染輸出頁面實例分析

    這篇文章主要介紹了express框架通過ejs模板渲染輸出頁面的方法,結(jié)合實例形式分析了express框架使用ejs模版引擎渲染輸出的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2023-05-05
  • 詳解Node.js如何處理ES6模塊

    詳解Node.js如何處理ES6模塊

    學(xué)習(xí)JavaScript語言,你會發(fā)現(xiàn)它有兩種格式的模塊。一種是ES6模塊,簡稱ESM;另一種是Node.js專用的CommonJS模塊,簡稱 CJS。這兩種模塊不兼容。很多人使用Node.js,只會用require()加載模塊,遇到ES6模塊就不知道該怎么辦。本文就來談?wù)凟S6模塊在Node.js里面怎么使用。
    2021-05-05
  • npm?install安裝過程報錯的實用解決辦法

    npm?install安裝過程報錯的實用解決辦法

    最近做項目遇到npm install 的問題,下面這篇文章主要給大家介紹了關(guān)于npm?install安裝過程報錯的實用解決辦法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 簡單實現(xiàn)nodejs上傳功能

    簡單實現(xiàn)nodejs上傳功能

    這篇文章主要為大家詳細(xì)介紹了如何簡單實現(xiàn)nodejs上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Node.js如何快速導(dǎo)出多表頭的excel文件實現(xiàn)方法

    Node.js如何快速導(dǎo)出多表頭的excel文件實現(xiàn)方法

    這篇文章主要為大家介紹了Node.js如何快速導(dǎo)出多表頭的excel文件實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評論

三明市| 昂仁县| 错那县| 亳州市| 广东省| 阿巴嘎旗| 原平市| 榆林市| 通州区| 兰坪| 册亨县| 深圳市| 鸡东县| 鹤庆县| 余江县| 武威市| 青阳县| 德格县| 海盐县| 石泉县| 临江市| 浦北县| 金平| 黄骅市| 龙口市| 礼泉县| 虎林市| 岱山县| 甘孜县| 乌什县| 前郭尔| 石河子市| 安顺市| 南通市| 高陵县| 会同县| 南华县| 尼玛县| 榆中县| 格尔木市| 宝鸡市|