QR code generator

This commit is contained in:
Michal Kolář
2024-03-28 16:05:28 +01:00
committed by Stanislav Fifik
parent cab4a1dba5
commit fd5639dbf3
2 changed files with 69 additions and 0 deletions

View 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;
}
}

View File

@@ -34,3 +34,4 @@ export {default as Eval} from './Eval';
export {default as QRCodeDetector} from './QRCodeDetector'; export {default as QRCodeDetector} from './QRCodeDetector';
export {default as MarkerDetector} from './MarkerDetector'; export {default as MarkerDetector} from './MarkerDetector';
export {default as WaitForAll} from './WaitForAll'; export {default as WaitForAll} from './WaitForAll';
export {default as QRCodeGenerator} from './QRCodeGenerator';