基于Node.js實現(xiàn)一鍵生成個性化二維碼
在前面
二維碼大家應該都用過了吧,常規(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
、Canvas
、PNG
、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
、backGroundImg
、outputFolder
和 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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
我的Node.js學習之路(三)--node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)
本篇文章主要介紹了node.js的幾個重要的知識點:node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)2014-07-07npm?install編譯時報"Cannot?read?properties?of?null?(r
這篇文章主要給大家介紹了關于npm?install編譯時報“Cannot?read?properties?of?null?(reading?‘pickAlgorithm‘)“錯誤的解決辦法,文中將解決方法介紹的非常詳細,需要的朋友可以參考下2022-07-07Nodejs連接mysql并實現(xiàn)增、刪、改、查操作的方法詳解
這篇文章主要介紹了Nodejs連接mysql并實現(xiàn)增、刪、改、查操作的方法,結(jié)合實例形式詳細分析了nodejs針對mysql數(shù)據(jù)庫的的連接、mysql數(shù)據(jù)庫的創(chuàng)建及nodejs針對mysql增刪改查等相關操作具體實現(xiàn)技巧,需要的朋友可以參考下2018-01-01Nodejs實現(xiàn)獲取實時數(shù)據(jù)的三種主流方式詳解
這篇文章主要為大家詳細介紹了Nodejs前端獲取實時數(shù)據(jù)的三種主流方式,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02Node.js+jade+mongodb+mongoose實現(xiàn)爬蟲分離入庫與生成靜態(tài)文件的方法
下面小編就為大家?guī)硪黄狽ode.js+jade+mongodb+mongoose實現(xiàn)爬蟲分離入庫與生成靜態(tài)文件的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09快速刪除 node_modules 目錄的集中方法(多種方法)
本文介紹了三種快速刪除node_modules目錄的方法:使用rimraf工具、通過npx運行rimraf以及在Windows命令提示符中使用del命令,每種方法都適合不同的操作系統(tǒng)和使用場景2024-11-11