@cataract6545/tmui
Version:
tm-vuetify是一个新势力由主题驱动的UI组件库,相比其它优势大,组件全,设计趋势紧跟未来。具有主题生成,主题实时切换,暗黑实时切换,lottie动画,图表等新颖功能,tmui TMUI
189 lines (166 loc) • 4.63 kB
text/typescript
/**
* canvas-qr
* create qrcode steam based on node-canvas
* core code is from https://github.com/neocotic/qr.js
*/
//globs
import { generateFrame } from "./qrcode"
import { qrOpts, qrOptsDefault } from "./interface";
var Canvas = null
, Image = null;
/**
* @param size {Number} canvassize
* @param lw {Number} logo width
* @param lh {Number} logo height
* return {Object}
*/
function computeLogoPos(size, lw, lh) {
return {
x: (size - lw) / 2
, y: (size - lh) / 2
, w: lw
, h: lh
}
}
/**
* @param option {Object}
* return {WriteSteam}
*/
export async function qr(ctx, option, canvas2d) {
if (!ctx) return;
var defaults = Object.assign({
...qrOptsDefault
}, option)
, size = defaults.size
, borderWidth = size * defaults.border
, qrSize = size - borderWidth * 2
, backgroundColor = defaults.backgroundColor
, backgroundImage = defaults.backgroundImage
, logoImage = defaults.logoImage
, i
, j
, points
, width
, fo
, px
, logoPos
, linearDir = defaults.linearDir
// var cvs = ctx
var c2d = ctx
if (!c2d?.width) {
c2d.width = size
}
if (!c2d?.height) {
c2d.height = size
}
//base background
fillStyle(c2d, defaults.baseColor, linearDir)
c2d.fillRect(0, 0, size, size)
c2d.save()
//draw background color
if (backgroundColor) {
fillStyle(c2d, backgroundColor, linearDir)
c2d.fillRect(0, 0, size, size)
}
c2d.restore()
//draw backgroundImage
if (backgroundImage) {
if (canvas2d) {
await drawImage(canvas2d, c2d, { width: size, height: size, src: backgroundImage, x: 0, y: 0 })
} else {
c2d.drawImage(backgroundImage, 0, 0, size, size)
}
}
//now draw qrcode
fo = generateFrame(defaults.str, defaults.ecc, qrSize)
points = fo.frameBuffer
width = fo.width
px = qrSize / width
fillStyle(c2d, defaults.forgroundColor, linearDir, linearDir)
for (i = 0; i < width; i++) {
for (j = 0; j < width; j++) {
if (points[j * width + i]) {
c2d.fillRect(borderWidth + px * i, borderWidth + px * j, px, px)
}
}
}
//draw logo image
if (logoImage) {
logoPos = computeLogoPos(size, defaults.logoWidth, defaults.logoHeight)
if (canvas2d) {
await drawImage(canvas2d, c2d, { width: defaults.logoWidth, height: defaults.logoHeight, src: logoImage, x: logoPos.x, y: logoPos.y })
} else {
c2d.drawImage(logoImage, logoPos.x, logoPos.y, defaults.logoWidth, defaults.logoHeight)
}
}
//非2d类需要draw。2d无需draw
if (!canvas2d) {
c2d.draw()
}
uni.hideLoading()
return ctx
}
function fillStyle(ctx, value, linearDir = "left") {
//绘制渐变
if (typeof value == 'object' && Array.isArray(value)) {
let w2w = parseInt(String(ctx.width / 2))
console.log(w2w)
var gradient = ctx.createLinearGradient(w2w, 0, w2w, ctx.width);
if (linearDir == "left") {
gradient = ctx.createLinearGradient(ctx.width, w2w, 0, w2w);
} else if (linearDir == "bottom") {
gradient = ctx.createLinearGradient(w2w, 0, w2w, ctx.width);
} else if (linearDir == "top") {
gradient = ctx.createLinearGradient(w2w, ctx.width, w2w, 0);
} else if (linearDir == "right") {
gradient = ctx.createLinearGradient(0, w2w, ctx.width, w2w);
} else if (linearDir == "tlbr") {
gradient = ctx.createLinearGradient(0, 0, ctx.width, ctx.width);
} else if (linearDir == "trbl") {
gradient = ctx.createLinearGradient(ctx.width, 0, 0, ctx.width);
} else if (linearDir == "bltr") {
gradient = ctx.createLinearGradient(0, ctx.width, ctx.width, 0);
} else if (linearDir == "brtl") {
gradient = ctx.createLinearGradient(ctx.width, ctx.width, 0, 0);
}
for (let i = 0, len = value.length; i < len; i++) {
let stop = i / len;
if (i == 0) stop = 0;
if (i == len - 1) stop = 1;
gradient.addColorStop(stop, value[i]);
}
console.log(gradient)
// gradient.addColorStop(1, value[1]);
// #ifdef APP-NVUE || MP-WEIXIN || MP-ALIPAY || MP-QQ
ctx.strokeStyle = gradient;
ctx.fillStyle = gradient;
// #endif
// #ifndef APP-NVUE || MP-WEIXIN || MP-ALIPAY || MP-QQ
ctx.setStrokeStyle(gradient)
ctx.setFillStyle(gradient)
// #endif
} else {
// #ifdef APP-NVUE || MP-WEIXIN || MP-ALIPAY || MP-QQ
ctx.fillStyle = value
// #endif
// #ifndef APP-NVUE || MP-WEIXIN || MP-ALIPAY || MP-QQ
ctx.setFillStyle(value)
// #endif
}
}
function drawImage(canvas2d, ctx, opts) {
uni.showLoading({
title: "..."
})
let img = canvas2d.createImage()
img.width = opts.width;
img.height = opts.height;
img.src = opts.src;
return new Promise(res => {
img.onload = function () {
ctx.drawImage(img, opts.x, opts.y, opts.width, opts.height)
uni.hideLoading()
res(true)
}
})
}