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

基于Node.js實現(xiàn)一鍵生成個性化二維碼

 更新時間:2024年03月05日 08:19:31   作者:JYeontu  
這篇文章主要為大家詳細介紹了如何使用Node.js、Jimp和QRCode庫,結(jié)合一個簡單的腳本,通過命令行命令來快速給二維碼加上指定的背景,打造更有個性化的二維碼,感興趣的可以了解下

在前面

二維碼大家應該都用過了吧,常規(guī)的二維碼都是千篇一律的黑白二維碼,那么我們可不可以讓二維碼變得更有個性化一點呢?本文將向你展示如何使用Node.js、Jimp和QRCode庫,結(jié)合一個簡單的腳本,通過命令行命令來快速給二維碼加上指定的背景,打造更有個性化的二維碼。

效果展示

功能實現(xiàn)

依賴引入

const QRCode = require("qrcode");
const fs = require("fs-extra");
const Jimp = require("jimp");
const inquirer = require("@jyeontu/j-inquirer");
const path = require("path");

qrcode:

這是一個用于生成二維碼的庫。它支持多種輸出格式,如 Buffer、CanvasPNG、SVG 等。在這個腳本中,它被用來生成二維碼的圖像數(shù)據(jù)。

fs-extra:

fs-extra 是一個擴展了 Node.js 原生 fs 模塊功能的庫,提供了更多實用的文件系統(tǒng)操作方法,如 copy、move、remove 等。在這個腳本中,它被用來寫入生成的二維碼圖像到文件系統(tǒng)。

Jimp:

Jimp 是一個圖像處理庫,它提供了讀取、寫入、創(chuàng)建、編輯圖像的功能。在這個腳本中,它被用來處理背景圖片和二維碼圖像的合成。

@jyeontu/j-inquirer:

@jyeontu/j-inquirer 是一個基于 inquirer 的封裝,它提供了一些額外的功能或改進。這個庫通常用于簡化命令行界面的創(chuàng)建過程,使得開發(fā)者可以更容易地構(gòu)建交互式的命令行應用程序。

path:

path 是 Node.js 的一個核心模塊,用于處理文件路徑。它提供了解析、連接、標準化路徑等功能。在這個腳本中,它被用來構(gòu)建文件路徑,以便正確地保存生成的圖像。

這些模塊共同協(xié)作,使得腳本能夠從用戶那里獲取必要的信息,生成二維碼圖像,處理背景圖片,并最終將合成后的圖像保存到指定的目錄。

獲取交互參數(shù)

const options = [
  {
    type: "input",
    message: "請輸入二維碼鏈接",
    name: "qrCodeUrl",
    default: "",
  },
  {
    type: "input",
    message: "請輸入二維碼尺寸",
    name: "qrCodeSize",
    default: "256",
    validate: function (input) {
      const isNumber = !isNaN(input) && !isNaN(parseFloat(input));
      if (isNumber) {
        return true; // 輸入有效
      } else {
        return "請輸入一個有效的數(shù)字"; // 輸入無效
      }
    },
  },
  {
    type: "file",
    message: "請選擇背景圖片",
    name: "backGroundImg",
    default: "",
    dirname: baseDir,
  },
  {
    type: "list",
    message: "是否保持背景圖片比例",
    name: "keepRate",
    default: "否",
    choices: ["是", "否"],
  },
  {
    type: "folder",
    message: "請選擇圖片存放目錄",
    name: "outputFolder",
    default: "",
    dirname: baseDir,
  },
];
async function ask(options) {
  const answers = await new inquirer(options).prompt();
  return answers;
}

const answers = await ask(options);
const { qrCodeUrl, qrCodeSize, backGroundImg, outputFolder, keepRate } = answers;

這段代碼是使用 @jyeontu/j-inquirer 庫創(chuàng)建的一個交互式命令行界面。它定義了一個包含五個輸入提示的問題列表,用于收集用戶生成二維碼所需的信息。下面是每個提示的詳細說明:

二維碼鏈接輸入

  • 類型:input
  • 消息:請輸入二維碼鏈接
  • 名稱:qrCodeUrl
  • 默認值:空字符串(""

二維碼尺寸輸入

  • 類型:input
  • 消息:請輸入二維碼尺寸
  • 名稱:qrCodeSize
  • 默認值:256
  • 驗證:確保輸入是一個有效的數(shù)字

背景圖片選擇

  • 類型:file
  • 消息:請選擇背景圖片
  • 名稱:backGroundImg
  • 默認值:空字符串(""
  • 目錄:當前工作目錄(baseDir

保持背景圖片比例

  • 類型:list
  • 消息:是否保持背景圖片比例
  • 名稱:keepRate
  • 默認值:
  • 選項:["是", "否"]

圖片存放目錄選擇

  • 類型:folder
  • 消息:請選擇圖片存放目錄
  • 名稱:outputFolder
  • 默認值:空字符串(""
  • 目錄:當前工作目錄(baseDir

ask 函數(shù)使用這個 options 數(shù)組來創(chuàng)建一個 inquirer 對話框,并通過 prompt 方法等待用戶輸入。一旦用戶完成輸入,answers 對象將包含所有用戶的答案。

最后,代碼從 answers 對象中解構(gòu)出所需的值:qrCodeUrl、qrCodeSize、backGroundImgoutputFolder 和 keepRate。這些值將被用于后續(xù)的二維碼生成和圖片處理邏輯。

生成二維碼圖片

async function generateQRCode(data, size) {
  try {
    // 設置二維碼的選項
    const options = {
      width: size,
      height: size,
      color: {
        dark: "#000000", // 二維碼的深色部分
        light: "#ffffff", // 二維碼的淺色部分(透明)
      },
    };
    // 使用 await 等待二維碼生成
    const qrCodeBuffer = await QRCode.toBuffer(data, options);
    // 將 Base64 字符串轉(zhuǎn)換為 Buffer
    const qrCodeBase64 = Buffer.from(qrCodeBuffer).toString("base64");
    // 保存二維碼圖片
    await fs.writeFile(`qrCode.png`, Buffer.from(qrCodeBuffer));
  } catch (error) {
    console.error("生成二維碼時發(fā)生錯誤:", error);
  }
}

函數(shù)參數(shù)

  • data:要編碼到二維碼中的數(shù)據(jù),通常是一個字符串,如網(wǎng)址或其他信息。
  • size:二維碼的尺寸,以像素為單位。這個值將用于設置二維碼圖像的寬度和高度。

設置二維碼選項

  • 創(chuàng)建一個選項對象 options,其中包含二維碼的寬度、高度和顏色設置。
  • width 和 height 屬性設置為傳入的 size 參數(shù)值,確保二維碼圖像是正方形。
  • color 對象定義了二維碼的深色和淺色。在這里,深色部分(通常是二維碼的條紋)設置為黑色(#000000),淺色部分(背景)設置為白色(#ffffff)。

生成二維碼

  • 使用 QRCode.toBuffer 方法異步生成二維碼圖像。這個方法接受 data 和 options 作為參數(shù),并返回一個包含二維碼圖像數(shù)據(jù)的 Buffer 對象。
  • 將生成的 Buffer 對象保存到名為 qrCode.png 的文件中。這里使用了 fs.writeFile 方法,它是 fs-extra 庫提供的一個異步文件寫入方法。

錯誤處理

如果在生成二維碼的過程中發(fā)生錯誤,將捕獲這個錯誤并打印到控制臺。

這個函數(shù)可以被調(diào)用,傳入需要編碼的數(shù)據(jù)和期望的二維碼尺寸,然后它會生成一個二維碼圖像并保存到當前工作目錄。

添加背景圖片

async function addBackground(backgroundUrl, size, outputFolder, keepRate) {
  try {
    // 加載背景圖片并調(diào)整尺寸
    const background = await Jimp.read(backgroundUrl);

    const width = keepRate === "是" ? background.bitmap.width : size;
    const height = keepRate === "是" ? background.bitmap.height : size;
    const minLen = Math.min(width, height);
    const rate = size / minLen;
    await background.resize(width * rate, height * rate); // 調(diào)整背景圖片尺寸

    // 加載二維碼圖片
    const qrCode = await Jimp.read("qrCode.png");
    // 設置二維碼的透明度,以便可以看到背景圖片
    qrCode.opacity(0.5); // 0.5 表示 50% 的透明度
    const x = (width * rate - size) / 2,
      y = (height * rate - size) / 2;
    // 將二維碼放置在背景圖片上
    background.composite(qrCode, x, y, {
      mode: Jimp.BLEND_SOURCE_OVER,
    });
    const outPath = path.join(outputFolder, "output.png");
    // 保存合成后的圖片
    await background.write(outPath);
    console.log(`合成后的圖片已保存為 ${outPath}`);
    fs.remove("qrCode.png");
  } catch (error) {
    console.error("添加背景時發(fā)生錯誤:", error);
  }
}

將生成的二維碼圖像添加到用戶選擇的背景圖片上,并保存最終的合成圖像。以下是該函數(shù)的詳細解釋:

函數(shù)參數(shù)

  • backgroundUrl:用戶選擇的背景圖片的路徑。
  • size:二維碼的尺寸,這個尺寸將用于調(diào)整背景圖片的大小。
  • outputFolder:用戶指定的輸出目錄,用于保存最終的合成圖片。
  • keepRate:用戶選擇的是否保持背景圖片比例的選項。

加載背景圖片

使用 Jimp.read 方法異步加載背景圖片。

調(diào)整背景圖片尺寸

  • 根據(jù) keepRate 的值決定是否保持背景圖片的原始比例。
  • 如果 keepRate 是 "是",則使用原始圖片的寬度或高度(取較小的一個)作為調(diào)整后的尺寸。
  • 如果 keepRate 是 "否",則直接使用 size 參數(shù)作為調(diào)整后的尺寸。
  • 計算調(diào)整后的尺寸與原始尺寸的比例,然后根據(jù)這個比例調(diào)整背景圖片的尺寸。

加載二維碼圖片

讀取名為 "qrCode.png" 的二維碼圖片文件。

設置二維碼透明度

將二維碼圖片的透明度設置為 50%,以便在背景圖片上可見。

合成圖片

  • 計算二維碼在背景圖片上的位置,使其居中顯示。
  • 使用 composite 方法將二維碼圖片合成到背景圖片上。

保存合成后的圖片

  • 在用戶指定的輸出目錄中保存合成后的圖片,文件名為 "output.png"。
  • 使用 fs.remove 方法刪除臨時生成的 "qrCode.png" 文件。

錯誤處理

如果在處理圖片的過程中發(fā)生錯誤,將捕獲這個錯誤并打印到控制臺。

這個函數(shù)是生成個性化二維碼流程的關鍵部分,它允許用戶將二維碼與個性化的背景圖片結(jié)合,創(chuàng)建一個獨特的視覺作品。通過調(diào)整透明度和尺寸,用戶可以在保持背景圖片特征的同時,確保二維碼的可讀性。

插件使用

插件安裝

直接通過npm進行全局安裝。

npm i -g jyeontu

插件使用

安裝完插件之后我們可以執(zhí)行以下命名:

jyeontu img

選擇自定義背景二維碼生成,安裝提示進行操作即可。

到此這篇關于基于Node.js實現(xiàn)一鍵生成個性化二維碼的文章就介紹到這了,更多相關Node.js二維碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 輕松創(chuàng)建nodejs服務器(10):處理POST請求

    輕松創(chuàng)建nodejs服務器(10):處理POST請求

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務器(10):處理POST請求,本文告訴你如何實現(xiàn)在node.js中處理POST請求,需要的朋友可以參考下
    2014-12-12
  • NodeJs Express框架實現(xiàn)服務器接口詳解

    NodeJs Express框架實現(xiàn)服務器接口詳解

    最近學習了基于前后端分離的開發(fā)模式,我前端使用Vue框架,后端使用nodejs開發(fā)API接口,下面這篇文章主要給大家介紹了關于nodejs使用Express框架寫后端接口的相關資料,需要的朋友可以參考下
    2022-08-08
  • nodejs文件夾深層復制功能

    nodejs文件夾深層復制功能

    這篇文章主要介紹了nodejs文件夾深層復制功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • npm?install?404問題解決方案

    npm?install?404問題解決方案

    這篇文章主要給大家介紹了關于npm?install?404問題解決的相關資料,npm install命令既可以下載服務器上的模塊,也可以在本地創(chuàng)建自己的模塊,需要的朋友可以參考下
    2023-08-08
  • node.js中Socket.IO的進階使用技巧

    node.js中Socket.IO的進階使用技巧

    這篇文章主要介紹了node.js中Socket.IO的進階使用技巧,本文講解了配置、房間、事件、授權等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • nodejs使用node-xlsx生成excel的方法示例

    nodejs使用node-xlsx生成excel的方法示例

    這篇文章主要介紹了nodejs使用node-xlsx生成excel,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • NodeJS和BootStrap分頁效果的實現(xiàn)代碼

    NodeJS和BootStrap分頁效果的實現(xiàn)代碼

    這篇文章主要介紹了NodeJS和BootStrap分頁效果的實現(xiàn)代碼的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • 前端之npm運行時配置文件.npmrc的方法(可用于配置npm淘寶源)

    前端之npm運行時配置文件.npmrc的方法(可用于配置npm淘寶源)

    這篇文章主要給大家介紹了關于前端之npm運行時配置文件.npmrc(可用于配置npm淘寶源)的相關資料,.npmrc 文件是用于配置 npm(Node.js 包管理器)行為的配置文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • Node.js使用Koa搭建 基礎項目

    Node.js使用Koa搭建 基礎項目

    時下前端工程師有很多人比較關注NodeJs以及express 框架或者Koa 框架之類的新技術。難得我最近閑時較多,利用一下舊歷新年尚未正式到來的這片閑暇,也來涉足其中,一窺其中奧妙。
    2018-01-01
  • Nodejs學習筆記之NET模塊

    Nodejs學習筆記之NET模塊

    之前兩篇文章基本上都是給我們介紹的nodejs的理論基礎,今天我們來點干貨,先從NET模塊開始講起吧。
    2015-01-01

最新評論

濮阳县| 新沂市| 集安市| 麟游县| 房山区| 苍溪县| 攀枝花市| 辽阳市| 二连浩特市| 天气| 天津市| 乌拉特前旗| 达拉特旗| 荆州市| 利辛县| 兰西县| 新疆| 沛县| 台中市| 沿河| 岑溪市| 龙游县| 克拉玛依市| 阿城市| 朝阳区| 会同县| 秦皇岛市| 甘洛县| 通河县| 沐川县| 晋州市| 大悟县| 和硕县| 东莞市| 隆尧县| 年辖:市辖区| 普兰县| 苏尼特右旗| 昭觉县| 临洮县| 井陉县|