vue實現二維碼生成器和解碼器

vue實現二維碼生成器和解碼器

1.生成基本二維碼:根據輸入的value生成二維碼。
2.可定制尺寸:通過size調整大小。
3.顏色和背景色:設置二維碼顏色和背景。
4.靜區(quiet zone)支持:通過quietZone調整周圍的空白區域。
5.錯誤糾正級別:ecl參數控制容錯級別。
6.漸變效果:啟用線性漸變,可以自定義方向和顏色。
7.Logo嵌入:在二維碼中間添加logo,可調整大小、邊距、背景色和圓角。
8.錯誤處理:生成失敗時顯示錯誤信息。
9.響應式更新:當props變化時自動重新生成二維碼。
10.視圖框調整:根據靜區計算viewBox,確保正確顯示。

效果圖:
在這里插入圖片描述

step1: 添加依賴 npm install qrcode @types/qrcode

step2:核心組件 實現二維碼
C:\Users\wangrusheng\PycharmProjects\untitled3\src\views\QrCode.vue

<template><!-- SVG 容器 --><svgv-if="!error":viewBox="viewBox":width="size":height="size"><!-- 背景 --><rect:x="-quietZone":y="-quietZone":width="size + quietZone * 2":height="size + quietZone * 2":fill="backgroundColor"/><!-- 漸變定義 --><defs v-if="enableLinearGradient"><linearGradientid="grad":x1="gradientDirection[0]":y1="gradientDirection[1]":x2="gradientDirection[2]":y2="gradientDirection[3]"><stop offset="0" :stop-color="linearGradient[0]" stop-opacity="1"/><stop offset="1" :stop-color="linearGradient[1]" stop-opacity="1"/></linearGradient></defs><!-- 二維碼路徑 --><path:d="path"stroke-linecap="butt":stroke="enableLinearGradient ? 'url(#grad)' : color":stroke-width="cellSize"/><!-- Logo 容器 --><svgv-if="logo":x="(size - logoSize - logoMargin * 2) / 2":y="(size - logoSize - logoMargin * 2) / 2"><!-- Logo 背景 --><rect:width="logoSize + logoMargin * 2":height="logoSize + logoMargin * 2":fill="logoBackgroundColor":rx="logoBorderRadius + (logoMargin / logoSize) * logoBorderRadius":ry="logoBorderRadius + (logoMargin / logoSize) * logoBorderRadius"/><!-- Logo 圖片 --><image:x="logoMargin":y="logoMargin":width="logoSize":height="logoSize":href="logo"preserveAspectRatio="xMidYMid slice":rx="logoBorderRadius":ry="logoBorderRadius"/></svg></svg><!-- 錯誤顯示 --><div v-if="error" class="error">{{ error.message }}</div>
</template><script setup lang="ts">
import { ref, watchEffect, computed } from 'vue'
import QRCode from 'qrcode'// Props 定義
const props = defineProps({value: { type: String, default: 'this is a QR code' },size: { type: Number, default: 100 },color: { type: String, default: 'black' },backgroundColor: { type: String, default: 'white' },logo: { type: String, default: undefined },logoSize: { type: Number, default: 100 * 0.2 }, // 默認基于 size 計算logoBackgroundColor: { type: String, default: 'transparent' },logoMargin: { type: Number, default: 2 },logoBorderRadius: { type: Number, default: 0 },quietZone: { type: Number, default: 0 },enableLinearGradient: { type: Boolean, default: false },gradientDirection: {type: Array as () => string[],default: () => ['0%', '0%', '100%', '100%']},linearGradient: {type: Array as () => string[],default: () => ['rgb(255,0,0)', 'rgb(0,255,255)']},ecl: { type: String as () => 'L'|'M'|'Q'|'H', default: 'M' }
})// 響應式數據
const path = ref('')
const cellSize = ref(0)
const error = ref<Error | null>(null)// 生成二維碼矩陣
const genMatrix = (value: string, errorCorrectionLevel: string): boolean[][] => {const arr = Array.prototype.slice.call(QRCode.create(value, { errorCorrectionLevel }).modules.data, 0)const sqrt = Math.sqrt(arr.length)return arr.reduce((rows: boolean[][], key: boolean, index: number) => {(index % sqrt === 0) ? rows.push([key]) : rows[rows.length - 1].push(key)return rows}, [])
}// 轉換矩陣為 SVG 路徑
const transformMatrixIntoPath = (matrix: boolean[][], size: number) => {const cellSize = size / matrix.lengthlet path = ''matrix.forEach((row, i) => {let needDraw = falserow.forEach((column, j) => {if (column) {if (!needDraw) {path += `M${cellSize * j} ${cellSize / 2 + cellSize * i} `needDraw = true}if (needDraw && j === matrix.length - 1) {path += `L${cellSize * (j + 1)} ${cellSize / 2 + cellSize * i} `}} else {if (needDraw) {path += `L${cellSize * j} ${cellSize / 2 + cellSize * i} `needDraw = false}}})})return { cellSize, path }
}// 計算 viewBox
const viewBox = computed(() => [-props.quietZone,-props.quietZone,props.size + props.quietZone * 2,props.size + props.quietZone * 2
].join(' '))// 監聽 props 變化
watchEffect(() => {try {const matrix = genMatrix(props.value, props.ecl)const result = transformMatrixIntoPath(matrix, props.size)path.value = result.pathcellSize.value = result.cellSizeerror.value = null} catch (err) {error.value = err instanceof Error ? err : new Error('QR Code generation failed')}
})
</script><style scoped>
.error {color: red;border: 1px solid red;padding: 1rem;
}
</style>

step3: 調用二維碼組件
C:\Users\wangrusheng\PycharmProjects\untitled3\src\views\ImgCode.vue

<template><QrCode:value="qrCodeValue":size="200"color="#333"logo="/logo.png":logo-size="40"logo-background-color="white":enable-linear-gradient="true"/>
</template><script setup>
import QrCode from './QrCode.vue'
import { ref } from 'vue'
// 圖片資源存放在 C:\Users\wangrusheng\PycharmProjects\untitled3\public\logo.png
// JSON.stringify() 是 JavaScript 中用于將對象或值轉換為 JSON 格式字符串的核心方法,
//value="你們好,這里是二維碼識別器,很高興認識你們"
const qrCodeValue = ref(JSON.stringify({"data": [{"case_id": 3,"category_id": 4,"title": "as","description": "ad","price": 4500.0,"client_id": 5,"lawyer_id": 6,"status": "pending","created_at": "2025-03-21T06:11:59","updated_at": "2025-03-21T06:11:59","category_name": "af"},{"case_id": 8,"category_id": 8,"title": "bs","description": "bd","price": 6000.0,"client_id": 5,"lawyer_id": 6,"status": "in_progress","created_at": "2025-03-21T06:11:59","updated_at": "2025-03-21T06:11:59","category_name": "bf"}]
}))
</script>

step4:路由

C:\Users\wangrusheng\PycharmProjects\untitled3\src\router\index.js
import ImgCode from '../views/ImgCode.vue'
{ path: '/imgcode', name: 'imgcode', component: ImgCode },C:\Users\wangrusheng\PycharmProjects\untitled3\src\App.vue
<router-link to="/imgcode" active-class="active-link">二維碼</router-link>

///我是分割線
解碼部分
step101:安裝依賴 pip install pyzbar Pillow,你去網站上,隨便找個二維碼生成器,然后將生成的二維碼保存本地

step102:解析C:\Users\wangrusheng\PycharmProjects\FastAPIProject1\hello.py

from pyzbar.pyzbar import decode
from PIL import Image# 二維碼圖片路徑 C:\Users\wangrusheng\Downloads
old_file = r'C:\Users\wangrusheng\Downloads\logoz.png'try:# 打開圖片文件with Image.open(old_file) as img:# 解析二維碼decoded_objects = decode(img)if not decoded_objects:print("未檢測到二維碼內容。")else:for obj in decoded_objects:# 解碼數據(假設內容為UTF-8文本)data = obj.data.decode('utf-8')print("解析結果:", data)except FileNotFoundError:print(f"錯誤:文件 '{old_file}' 不存在。")
except Exception as e:print(f"解析時發生錯誤: {str(e)}")

step103:運行

(.venv) PS C:\Users\wangrusheng\PycharmProjects\FastAPIProject1> python hello.py 
解析結果: 能不能點點贊  點點關注,我謝謝大家
(.venv) PS C:\Users\wangrusheng\PycharmProjects\FastAPIProject1> 

end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75326.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nacos:Nacos服務注冊與服務發現超詳細的源碼解析(二)

&#x1fa81;&#x1f341; 希望本文能給您帶來幫助&#xff0c;如果有任何問題&#xff0c;歡迎批評指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目錄 一、背景二、環境與依賴三、服務注冊與服務發現總流程圖四、服務注冊源碼4.1 客戶端4.1.1…

ECMAScript 6 新特性(二)

ECMAScript 6 新特性&#xff08;二&#xff09; ECMAScript 6 新特性&#xff08;一&#xff09; ECMAScript 6 新特性&#xff08;二&#xff09;&#xff08;本文&#xff09; ECMAScript 7~10 新特性 1. 生成器 生成器函數是 ES6 提供的一種解決異步編程方案&#xff0c;一…

深入理解 RxSwift 中的 Driver:用法與實踐

目錄 前言 一、什么是Driver 1.不會發出錯誤 2.主線程保證 3.可重放 4.易于綁定 二、Driver vs Observable 三、使用場景 1.綁定數據到UI控件 2.響應用戶交互 3.需要線程安全的邏輯 4.如何使用Driver? 1.綁定文本輸入到Label 2.處理按鈕點擊事件 3.從網絡請求…

Linux自行實現的一個Shell(15)

文章目錄 前言一、頭文件和全局變量頭文件全局變量 二、輔助函數獲取用戶名獲取主機名獲取當前工作目錄獲取最后一級目錄名生成命令行提示符打印命令行提示符 三、命令處理獲取用戶輸入解析命令行執行外部命令 四、內建命令添加環境變量檢查和執行內建命令 五、初始化初始化環境…

RocketMQ和kafka 的區別

一、數據可靠性與容錯機制 數據可靠性 RocketMQ支持同步刷盤和同步復制&#xff0c;確保消息寫入磁盤后才返回確認&#xff0c;單機可靠性高達10個9&#xff0c;即使操作系統崩潰也不會丟失數據。而Kafka默認采用異步刷盤和異步復制&#xff0c;雖然吞吐量高&#xff0c;但極端…

在 openEuler 24.03 (LTS) 操作系統上添加 ollama 作為系統服務的步驟

以下是在 openEuler 操作系統上添加 ollama 作為系統服務的步驟&#xff1a; 創建 systemd 服務文件 sudo vi /etc/systemd/system/ollama.service將以下內容寫入服務文件&#xff08;按需修改參數&#xff09;&#xff1a; [Unit] DescriptionOllama Service Afternetwork.…

光譜相機的關鍵技術參數

光譜相機的關鍵技術參數直接影響其數據獲取能力和應用場景適配性。以下是核心參數的詳細解析&#xff0c;涵蓋光譜性能、空間性能、硬件性能及環境適應性&#xff1a; 一、光譜性能參數? ?1. 光譜范圍&#xff08;Spectral Range&#xff09;? ?定義?&#xff1a;相機可…

ARM內核與寄存器

ARM內核與寄存器詳解 目錄 ARM架構概述ARM處理器模式 Cortex-M3內核的處理器模式Cortex-A系列處理器模式 ARM寄存器集 通用寄存器程序計數器(PC)鏈接寄存器(LR)堆棧指針(SP)狀態寄存器(CPSR/SPSR) 協處理器寄存器NEON和VFP寄存器寄存器使用規范常見ARM指令與寄存器操作 ARM架…

Git 拉取時常見沖突及解決方法總結

Git 拉取時常見沖突及解決方法總結 一、常見錯誤場景1. 本地修改與遠程修改沖突解決方法 2. 未跟蹤文件與遠程文件沖突解決方法 3. 子模塊權限問題解決方法 二、總結 在日常開發中&#xff0c;使用 Git 進行團隊協作和代碼管理時&#xff0c;經常會遇到拉取代碼&#xff08;git…

深度學習、圖像算法學習記錄

深度學習加速 綜述文檔&#xff1a; https://chenzomi12.github.io/02Hardware01Foundation/02ArchSlim.html winograd: https://zhuanlan.zhihu.com/p/260109670 ncnn 1.修改模型結構&#xff0c;優化模型內存訪問次數&#xff0c;加速。 VGG 和 InceptionNet &#xff1a; …

Java中的Exception和Error有什么區別?還有更多擴展

概念 在Java中&#xff0c;Exception和Error都是Throwable的子類&#xff0c;用于處理程序中的錯誤和異常情況。 然而&#xff0c;它們在用途和處理方式上有顯著的不同&#xff1a; Exception&#xff1a; 用于表示程序在正常運行過程中可能出現的錯誤&#xff0c;如文件未找…

文章記單詞 | 第26篇(六級)

一&#xff0c;單詞釋義 actor&#xff1a;名詞&#xff0c;演員mask&#xff1a;名詞&#xff0c;面具&#xff1b;口罩&#xff1b;遮蓋物&#xff1b;動詞&#xff0c;掩飾&#xff1b;戴面具&#xff1b;遮蓋construct&#xff1a;動詞&#xff0c;建造&#xff1b;構造&a…

LeetCode算法題(Go語言實現)_38

題目 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 一、代碼實現 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {if root nil || root p || root q {return root}left : lowes…

Java 基礎語法、Java注釋

Java 基礎語法 一個 Java 程序可以認為是一系列對象的集合,而這些對象通過調用彼此的方法來協同工作。下面簡要介紹下類、對象、方法和實例變量的概念。 對象:對象是類的一個實例,有狀態和行為。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫…

用VScode來編寫前后端——構建基礎框架

前言 我寫這一個板塊的原因是我參加了我們學校的新生項目課&#xff0c;需要創立一個系統&#xff0c;我們小組選的標題的基于計算機視覺的商品識別系統&#xff0c;那么我們需要一個網站來展示我們的功能&#xff0c;故寫這些來記錄一下自己&#xff0c;大家如果有什么問題的話…

git clone阻塞問題

問題描述 git clone采用的ssh協議&#xff0c;在克隆倉庫的時候&#xff0c;會經常卡一下&#xff0c;亦或是直接卡死不動。 最開始以為是公司電腦配置的問題&#xff0c;想著自己實在解決不了找it幫忙。 查閱資料發現&#xff0c;最終發現是git版本的問題&#xff0c;這個是…

WEB攻防-Java安全JNDIRMILDAP五大不安全組件RCE執行不出網不回顯

目錄 1. RCE執行-5大類函數調用 1.1 Runtime方式 1.2 Groovy執行命令 1.3 腳本引擎代碼注入 1.4 ProcessImpl 1.5 ProcessBuilder 2. JNDI注入(RCE)-RMI&LDAP&高版本 2.1 RMI服務中的JNDI注入場景 2.2 LDAP服務中的JNDI注入場景 攻擊路徑示例&#…

【Hadoop入門】Hadoop生態之Sqoop簡介

1 什么是Sqoop&#xff1f; 在企業的數據架構中&#xff0c;關系型數據庫與Hadoop生態系統之間的數據流動是常見且關鍵的需求。Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;正是為解決這一問題而生的高效工具&#xff0c;它專門用于在結構化數據存儲&#xff08;如RDBMS…

如何自動檢測使用的組件庫有更新

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&#…

Go語言編寫一個進銷存Web軟件的demo

Go語言編寫一個進銷存Web軟件的demo 用戶現在要求用。之前他們已經討論了用Django實現的方案&#xff0c;現在突然切換到Go&#xff0c;可能有幾個原因。首先&#xff0c;用戶可能對Go語言感興趣&#xff0c;或者他們公司的技術棧轉向了Go。其次&#xff0c;用戶可能希望比較不…