import { toCanvas } from 'qrcode';
|
import type { QRCodeRenderersOptions } from 'qrcode';
|
import { RenderQrCodeParams, ContentType } from './typing';
|
import { cloneDeep } from 'lodash-es';
|
|
export const renderQrCode = ({
|
canvas,
|
content,
|
width = 0,
|
options: params = {},
|
}: RenderQrCodeParams) => {
|
const options = cloneDeep(params);
|
// 容错率,默认对内容少的二维码采用高容错率,内容多的二维码采用低容错率
|
options.errorCorrectionLevel = options.errorCorrectionLevel || getErrorCorrectionLevel(content);
|
|
return getOriginWidth(content, options).then((_width: number) => {
|
options.scale = width === 0 ? undefined : (width / _width) * 4;
|
return toCanvas(canvas, content, options);
|
});
|
};
|
|
// 得到原QrCode的大小,以便缩放得到正确的QrCode大小
|
function getOriginWidth(content: ContentType, options: QRCodeRenderersOptions) {
|
const _canvas = document.createElement('canvas');
|
return toCanvas(_canvas, content, options).then(() => _canvas.width);
|
}
|
|
// 对于内容少的QrCode,增大容错率
|
function getErrorCorrectionLevel(content: ContentType) {
|
if (content.length > 36) {
|
return 'M';
|
} else if (content.length > 16) {
|
return 'Q';
|
} else {
|
return 'H';
|
}
|
}
|