【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第1頁
【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第2頁
【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第3頁
【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第4頁
【移動應(yīng)用開發(fā)技術(shù)】怎么利用小程序的canvas來繪制二維碼_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論