WeChat 애플릿에서 QR 코드를 생성하는 방법은 무엇입니까? 다음 글에서는 미니 프로그램의 캔버스 기능을 활용하여 QR 코드를 그리는 방법을 소개하겠습니다.
WeChat 미니 프로그램 사업에서 QR 코드를 표시해야 하는 몇 가지 시나리오가 있습니다. 정적 QR코드는 로컬에 직접 저장하고 사진을 이용해 표시할 수 있지만, 사용자 관련 정보를 기반으로 동적 QR코드를 생성하는 데에는 적합하지 않습니다. 이 기사에서는 미니 프로그램의 캔버스 기능을 사용하여 QR 코드를 그리는 방법을 소개합니다.
wx-qr
WeChat 개발자 도구를 열어
배경 이미지 포함
|
을 확인하세요. 로고 포함
|
로고+배경 이미지 포함
|
1.2 설치
# 通过 npm 安装 npm i wx-qr -S # 通过 yarn 安装 yarn add wx-qr
1.3
컴포넌트 사용 먼저 개발한 애플릿의 루트 디렉터리인 app.json
또는 필요한 xxx로 이동합니다. json에서 참조되는 구성 요소를 사용합니다.
app.json
或需要使用该组件的 xxx.json
中引用组件
(注意:请不要将组件命名为 wx-xxx
开头,可能会导致微信小程序解析 tag 失败 )
{ "usingComponents": { "qr-container": "wx-qr" } }
之后就可以在 wxml
wx-xxx
로 시작하는 구성 요소 이름을 지정하지 마십시오. 그러면 WeChat 애플릿이 태그를 구문 분석하지 못할 수 있습니다.) <qr-container text="{{qrTxt}}" size="750"></qr-container>그런 다음
wxml
Page({ data: { qrTxt: 'https://github.com/liuxdi/wx-qr', }, });
<canvas id="qr" type="2d" style="height: 750rpx;width: 750rpx;"></canvas>물론 다양한 구성도 지원할 수 있습니다. 자세한 내용은 github 또는
2. 방법 2: 캔버스 드로잉과 결합된 QRCode.js 기반
2.0 QR 코드의 일부위 이외의 나머지 위치에는 데이터 코드 데이터 코드와 오류 수정 코드 오류 수정 코드가 저장됩니다.정렬 패턴 버전 2 이상(버전 2 포함)의 QR 코드에만 이 항목이 필요하며 위치 지정에도 사용됩니다.
- Positioning 패턴
- Position 감지 패턴은 다음과 같은 위치 지정 패턴입니다. 두 번째 QR 코드의 직사각형 크기를 표시하십시오. 이 세 가지 위치 지정 패턴은 흰색 가장자리를 가지며 위치 감지 패턴용 구분 기호라고 합니다. 4개가 아닌 3개가 있는 이유는 3개가 직사각형을 표시할 수 있다는 의미입니다.
- 타이밍 패턴은 위치 지정에도 사용됩니다. 그 이유는 QR코드의 크기가 40개이기 때문입니다. 크기가 너무 크면 표준선이 있어야 하고, 그렇지 않으면 비뚤어지게 스캔될 수 있습니다.
버전 정보 >= 버전 7 이상인 경우 일부 버전 정보를 저장하려면 3 x 6 영역 2개를 예약해야 합니다.
- 기능적 데이터
- 형식 정보는 모든 크기로 존재하며 일부 형식화된 데이터를 저장하는 데 사용됩니다.
- 데이터 코드 및 오류 수정 코드
2.1 QR 코드 데이터 생성 라이브러리 소개
qrcode.js를 미니 프로그램의 해당 디렉토리에 복사하세요.
2.2 미니 프로그램에서 캔버스 태그를 생성하고 캔버스의 길이와 너비를 설정합니다.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);
})
// 二维码的颜色
const colorDark = '#000';
// 获取二维码的大小,因css设置的为750rpx,将其转为px
const rawViewportSize = getPxFromRpx(750);
// 二维码容错率{ L: 1, M: 0, Q: 3, H: 2 }
const correctLevel = 0;
// 创建二维码实例对象,并添加数据进行生成
const qrCode = new QRCodeModel(-1, correctLevel);
qrCode.addData(url);
qrCode.make();
// 每个方向的二维码数量
const nCount = qrCode.moduleCount;
// 计算每个二维码方块的大小
const nSize = getRoundNum(rawViewportSize / nCount, 3)
// 每块二维码点的大小比例
const dataScale = 1;
// 计算出dataScale不为1时,每个点的偏移值
const dataXyOffset = (1 - dataScale) * 0.5;
// 循环行列绘制数据码区
for (let row = 0; row < nCount; row++) {
for (let col = 0; col < nCount; col++) {
// row 和 col 处的模块是否是黑色区
const bIsDark = qrCode.isDark(row, col);
// 是否是二维码的图案定位标识区 Position Detection Pattern(如本模块,是三个顶点位置处的大方块)
const isBlkPosCtr = (col < 8 && (row < 8 || row >= nCount - 8)) || (col >= nCount - 8 && row < 8);
// 是否是Timing Patterns,也是用于协助定位扫描的
const isTiming = (row == 6 && col >= 8 && col <= nCount - 8) || (col == 6 && row >= 8 && row <= nCount - 8);
// 如果是这些区域 则不进行绘制
let isProtected = isBlkPosCtr || isTiming;
// 计算每个点的绘制位置(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)";
// 如果不是标识区,则进行绘制
if (!isProtected) {
ctx.fillRect(
nLeft,
nTop,
(isProtected ? (isBlkPosCtr ? 1 : 1) : dataScale) * nSize,
(isProtected ? (isBlkPosCtr ? 1 : 1) : dataScale) * nSize
);
}
}
}
의 데이터 코드 중
QRCodeModel
은 qrCode.js에서 가져옵니다// 绘制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 timingXyOffset = (1 - timingScale) * 0.5; for (let i = 0; i < nCount - 8; i += 2) { _drawDot(ctx, 8 + i, 6, nSize, timingXyOffset, timingScale); _drawDot(ctx, 6, 8 + i, nSize, timingXyOffset, timingScale); } // 绘制Timing Patterns 完毕이 때 QR 코드의 데이터 코드 영역이 그려집니다.
2.5 그래픽 인식 영역 그리기
rrreee 이때 간단한 QR코드가 성공적으로 그려졌습니다~
코드에 대한 자세한 내용은 WeChat 애플릿 코드 스니펫
https://developers을 참조하세요. weixin.qq.com/s/WHJj73mX7bwv
이 코드는 간단한 QR 코드 생성 로직을 제공합니다. 좀 더 복잡한 QR 코드 표시 기능이 필요한 경우wx-qr을 사용하거나 내부의 특정 코드를 참조하는 것이 좋습니다. 이슈와 스타 제기에 오신 것을 환영합니다~~
[관련 학습 추천: 🎜미니 프로그램 개발 튜토리얼🎜]🎜위 내용은 미니 프로그램의 캔버스를 사용하여 QR 코드를 그리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!