import { toCanvas } from 'qrcode' import type { QRCodeRenderersOptions } from 'qrcode' import { RenderQrCodeParams, ContentType } from './types' // 得到原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' } } export const renderQrCode = ({ canvas, content, width = 0, options = {} }: RenderQrCodeParams) => { // 容错率,默认对内容少的二维码采用高容错率,内容多的二维码采用低容错率 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) }) }