QR code generator
This commit is contained in:
68
src/nodes/QRCodeGenerator.ts
Normal file
68
src/nodes/QRCodeGenerator.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import {
|
||||
ImageVar,
|
||||
NumberVar,
|
||||
StringVar,
|
||||
} from './io/AbstractIOSet';
|
||||
import Node from './Node';
|
||||
import {canvasPool2D} from '../canvas/CanvasPool';
|
||||
import {BrowserQRCodeSvgWriter} from '@zxing/browser';
|
||||
|
||||
const inputs = {
|
||||
text: {
|
||||
type: 'String'
|
||||
} as StringVar,
|
||||
size: {
|
||||
type: 'Number',
|
||||
} as NumberVar,
|
||||
}
|
||||
|
||||
const outputs = {
|
||||
image: {
|
||||
type: 'Image'
|
||||
} as ImageVar,
|
||||
size: {
|
||||
type: 'Number',
|
||||
} as NumberVar,
|
||||
};
|
||||
|
||||
export default class QRCodeGenerator extends Node<typeof inputs, typeof outputs> {
|
||||
writer: BrowserQRCodeSvgWriter;
|
||||
|
||||
constructor(options = {}) {
|
||||
super('QRCodeGenerator', inputs, outputs);
|
||||
this.writer = new BrowserQRCodeSvgWriter();
|
||||
}
|
||||
|
||||
async _update() {
|
||||
if (!this.in.text.value || !this.in.size.value || this.in.size.value < 100) {
|
||||
return;
|
||||
}
|
||||
const svgElement = this.writer.write(this.in.text.value, this.in.size.value, this.in.size.value);
|
||||
const canvas = canvasPool2D.createCanvas();
|
||||
canvas.width = this.in.size.value;
|
||||
canvas.height = this.in.size.value;
|
||||
canvas.acquire();
|
||||
const canvasContext = canvas.getContext('2d');
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
const serializer = new XMLSerializer();
|
||||
const svgString = serializer.serializeToString(svgElement);
|
||||
const svgDataUrl = "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(svgString)));
|
||||
|
||||
const img = new Image();
|
||||
img.onload = () => {
|
||||
canvasContext.drawImage(img, 0, 0);
|
||||
resolve(img);
|
||||
};
|
||||
|
||||
img.onerror = () => {
|
||||
reject(new Error('Failed to load image'));
|
||||
};
|
||||
|
||||
img.src = svgDataUrl;
|
||||
});
|
||||
|
||||
this.out.size.value = this.in.size.value;
|
||||
this.out.image.value = canvas;
|
||||
}
|
||||
}
|
||||
@@ -34,3 +34,4 @@ export {default as Eval} from './Eval';
|
||||
export {default as QRCodeDetector} from './QRCodeDetector';
|
||||
export {default as MarkerDetector} from './MarkerDetector';
|
||||
export {default as WaitForAll} from './WaitForAll';
|
||||
export {default as QRCodeGenerator} from './QRCodeGenerator';
|
||||
|
||||
Reference in New Issue
Block a user