![【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第1頁](http://file4.renrendoc.com/view/2c743baf7818cbe58870ca1a9caeeecc/2c743baf7818cbe58870ca1a9caeeecc1.gif)
![【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第2頁](http://file4.renrendoc.com/view/2c743baf7818cbe58870ca1a9caeeecc/2c743baf7818cbe58870ca1a9caeeecc2.gif)
![【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第3頁](http://file4.renrendoc.com/view/2c743baf7818cbe58870ca1a9caeeecc/2c743baf7818cbe58870ca1a9caeeecc3.gif)
![【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第4頁](http://file4.renrendoc.com/view/2c743baf7818cbe58870ca1a9caeeecc/2c743baf7818cbe58870ca1a9caeeecc4.gif)
![【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第5頁](http://file4.renrendoc.com/view/2c743baf7818cbe58870ca1a9caeeecc/2c743baf7818cbe58870ca1a9caeeecc5.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼
本篇文章給大家分享的是有關(guān)怎么利用小程序的canvas來繪制二維碼,在下覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著在下一起來看看吧。在微信小程序的業(yè)務(wù)中會有一些需要展示二維碼的場景。靜態(tài)二維碼可以直接存放在本地,使用圖片方式展示,但不適合根據(jù)用戶相關(guān)信息生成動態(tài)的二維碼。下面將介紹下利用小程序的canvas能力繪制二維碼。1方法一:通過wx-qr直接生成1.1DEMO微信開發(fā)者工具打開查看#
通過
npm
安裝1.2安裝npm
i
wx-qr
-S
#
通過
yarn
安裝
yarn
add
wx-qr1.3使用組件首先在你所開發(fā)的小程序根目錄app.json或需要使用該組件的xxx.json中引用組件(注意:請不要將組件命名為wx-xxx開頭,可能會導(dǎo)致微信小程序解析tag失?。﹞
"usingComponents":
{
"qr-container":
"wx-qr"
}
}之后就可以在wxml中直接使用組件<qr-container
text="{{qrTxt}}"
size="750"></qr-container>Page({
data:
{
qrTxt:
'/liuxdi/wx-qr',
},
});當(dāng)然,還可以支持很多種配置,詳見github或者碼云文檔。2.方式二:基于QRCode.js結(jié)合canvas繪制2.0二維碼的組成部分定位圖案PositionDetectionPattern是定位圖案,用于標(biāo)記二維碼的矩形大小。這三個定位圖案有白邊叫SeparatorsforPostionDetectionPatterns。之所以三個而不是四個意思就是三個就可以標(biāo)識一個矩形了。TimingPatterns也是用于定位的。原因是二維碼有40種尺寸,尺寸過大了后需要有根標(biāo)準(zhǔn)線,不然掃描的時候可能會掃歪了。AlignmentPatterns只有Version2以上(包括Version2)的二維碼需要這個東東,同樣是為了定位用的。功能性數(shù)據(jù)FormatInformation存在于所有的尺寸中,用于存放一些格式化數(shù)據(jù)的。VersionInformation在>=Version7以上,需要預(yù)留兩塊3x6的區(qū)域存放一些版本信息。數(shù)據(jù)碼和糾錯碼除了上述的那些地方,剩下的地方存放DataCode數(shù)據(jù)碼和ErrorCorrectionCode糾錯碼。PositionDetectionPattern是定位圖案,用于標(biāo)記二維碼的矩形大小。這三個定位圖案有白邊叫SeparatorsforPostionDetectionPatterns。之所以三個而不是四個意思就是三個就可以標(biāo)識一個矩形了。TimingPatterns也是用于定位的。原因是二維碼有40種尺寸,尺寸過大了后需要有根標(biāo)準(zhǔn)線,不然掃描的時候可能會掃歪了。AlignmentPatterns只有Version2以上(包括Version2)的二維碼需要這個東東,同樣是為了定位用的。FormatInformation存在于所有的尺寸中,用于存放一些格式化數(shù)據(jù)的。VersionInformation在>=Version7以上,需要預(yù)留兩塊3x6的區(qū)域存放一些版本信息。除了上述的那些地方,剩下的地方存放DataCode數(shù)據(jù)碼和ErrorCorrectionCode糾錯碼。2.1引入二維碼數(shù)據(jù)生成庫復(fù)制qrcode.js至你的小程序相應(yīng)目錄。2.2小程序中建立canvas標(biāo)簽,并給canvas設(shè)置長寬<canvas
id="qr"
type="2d"
style="height:
750rpx;width:
750rpx;"></canvas>2.3獲取canvas實(shí)例及上下文const
query
=
this.createSelectorQuery();
let
dpr
=
wx.getSystemInfoSync().pixelRatio;
query.select('#qr').fields({
node:
true,
size:
true,
id:
true
})
.exec((res)
=>
{
let
{
node:
canvas,
height,
width
}
=
res[0];
let
ctx
=
canvas.getContext('2d');
canvas.width
=
width
*
dpr
canvas.height
=
height
*
dpr
ctx.scale(dpr,
dpr);
})2.4定義一些變量及繪制二維碼的數(shù)據(jù)碼區(qū)其中QRCodeModel是從qrCode.js中導(dǎo)入的//
二維碼的顏色
const
colorDark
=
'#000';
//
獲取二維碼的大小,因css設(shè)置的為750rpx,將其轉(zhuǎn)為px
const
rawViewportSize
=
getPxFromRpx(750);
//
二維碼容錯率{
L:
1,
M:
0,
Q:
3,
H:
2
}
const
correctLevel
=
0;
//
創(chuàng)建二維碼實(shí)例對象,并添加數(shù)據(jù)進(jìn)行生成
const
qrCode
=
new
QRCodeModel(-1,
correctLevel);
qrCode.addData(url);
qrCode.make();
//
每個方向的二維碼數(shù)量
const
nCount
=
qrCode.moduleCount;
//
計(jì)算每個二維碼方塊的大小
const
nSize
=
getRoundNum(rawViewportSize
/
nCount,
3)
//
每塊二維碼點(diǎn)的大小比例
const
dataScale
=
1;
//
計(jì)算出dataScale不為1時,每個點(diǎn)的偏移值
const
dataXyOffset
=
(1
-
dataScale)
*
0.5;
//
循環(huán)行列繪制數(shù)據(jù)碼區(qū)
for
(let
row
=
0;
row
<
nCount;
row++)
{
for
(let
col
=
0;
col
<
nCount;
col++)
{
//
row
和
col
處的模塊是否是黑色區(qū)
const
bIsDark
=
qrCode.isDark(row,
col);
//
是否是二維碼的圖案定位標(biāo)識區(qū)
Position
Detection
Pattern(如本模塊,是三個頂點(diǎn)位置處的大方塊)
const
isBlkPosCtr
=
(col
<
8
&&
(row
<
8
||
row
>=
nCount
-
8))
||
(col
>=
nCount
-
8
&&
row
<
8);
//
是否是Timing
Patterns,也是用于協(xié)助定位掃描的
const
isTiming
=
(row
==
6
&&
col
>=
8
&&
col
<=
nCount
-
8)
||
(col
==
6
&&
row
>=
8
&&
row
<=
nCount
-
8);
//
如果是這些區(qū)域
則不進(jìn)行繪制
let
isProtected
=
isBlkPosCtr
||
isTiming;
//
計(jì)算每個點(diǎn)的繪制位置(left,top)
const
nLeft
=
col
*
nSize
+
(isProtected
?
0
:
dataXyOffset
*
nSize);
const
nTop
=
row
*
nSize
+
(isProtected
?
0
:
dataXyOffset
*
nSize);
//
描邊色、線寬、填充色配置
ctx.strokeStyle
=
colorDark;
ctx.lineWidth
=
0.5;
ctx.fillStyle
=
bIsDark
?
colorDark
:
"rgba(255,
255,
255,
0.6)";
//
如果不是標(biāo)識區(qū),則進(jìn)行繪制
if
(!isProtected)
{
ctx.fillRect(
nLeft,
nTop,
(isProtected
?
(isBlkPosCtr
?
1
:
1)
:
dataScale)
*
nSize,
(isProtected
?
(isBlkPosCtr
?
1
:
1)
:
dataScale)
*
nSize
);
}
}
}此時已經(jīng)繪制出二維碼的數(shù)據(jù)碼區(qū):2.5繪制圖形識別區(qū)//
繪制Position
Detection
Pattern
ctx.fillStyle
=
colorDark;
ctx.fillRect(0,
0,
7
*
nSize,
nSize);
ctx.fillRect((nCount
-
7)
*
nSize,
0,
7
*
nSize,
nSize);
ctx.fillRect(0,
6
*
nSize,
7
*
nSize,
nSize);
ctx.fillRect((nCount
-
7)
*
nSize,
6
*
nSize,
7
*
nSize,
nSize);
ctx.fillRect(0,
(nCount
-
7)
*
nSize,
7
*
nSize,
nSize);
ctx.fillRect(0,
(nCount
-
7
+
6)
*
nSize,
7
*
nSize,
nSize);
ctx.fillRect(0,
0,
nSize,
7
*
nSize);
ctx.fillRect(6
*
nSize,
0,
nSize,
7
*
nSize);
ctx.fillRect((nCount
-
7)
*
nSize,
0,
nSize,
7
*
nSize);
ctx.fillRect((nCount
-
7
+
6)
*
nSize,
0,
nSize,
7
*
nSize);
ctx.fillRect(0,
(nCount
-
7)
*
nSize,
nSize,
7
*
nSize);
ctx.fillRect(6
*
nSize,
(nCount
-
7)
*
nSize,
nSize,
7
*
nSize);
ctx.fillRect(2
*
nSize,
2
*
nSize,
3
*
nSize,
3
*
nSize);
ctx.fillRect((nCount
-
7
+
2)
*
nSize,
2
*
nSize,
3
*
nSize,
3
*
nSize);
ctx.fillRect(2
*
nSize,
(nCount
-
7
+
2)
*
nSize,
3
*
nSize,
3
*
nSize);
//
繪制Position
Detection
Pattern
完畢
//
繪制Timing
Patterns
const
timingScale
=
1;
const
timi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物運(yùn)輸合同模板-@-1
- 福建圍墻垂直綠化施工方案
- 主播轉(zhuǎn)讓合同范本
- 波紋管涵拆除施工方案
- 良心裝飾公司招商方案
- 可以變更勞動合同范例
- 通風(fēng)與空調(diào)施工方案
- 魚塘招租競標(biāo)方案
- 傳媒公司實(shí)習(xí)合同范例
- 圍墻三方合同范本
- 外科護(hù)理課程思政課程標(biāo)準(zhǔn)
- 船舶航行安全
- 道德經(jīng)全文完整版本
- 9.2溶解度(第1課時飽和溶液不飽和溶液)+教學(xué)設(shè)計(jì)-2024-2025學(xué)年九年級化學(xué)人教版(2024)下冊
- 2024年審計(jì)局公務(wù)員招錄事業(yè)單位招聘考試招錄139人完整版附答案【研優(yōu)卷】
- 濰坊市人民醫(yī)院招聘真題
- 銷售人員薪資提成及獎勵制度
- 2017年江蘇南京中考滿分作文《無情歲月有味詩》5
- 2023年宏觀經(jīng)濟(jì)學(xué)考點(diǎn)難點(diǎn)
- 2024-2030年中國智慧水務(wù)行業(yè)應(yīng)用需求分析發(fā)展規(guī)劃研究報(bào)告
- 黑龍江申論真題2021年(鄉(xiāng)鎮(zhèn))
評論
0/150
提交評論