From fd5639dbf3b6bde4838342e1b999ea17c2ea9c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kol=C3=A1=C5=99?= Date: Thu, 28 Mar 2024 16:05:28 +0100 Subject: [PATCH] QR code generator --- src/nodes/QRCodeGenerator.ts | 68 ++++++++++++++++++++++++++++++++++++ src/nodes/index.ts | 1 + 2 files changed, 69 insertions(+) create mode 100644 src/nodes/QRCodeGenerator.ts diff --git a/src/nodes/QRCodeGenerator.ts b/src/nodes/QRCodeGenerator.ts new file mode 100644 index 0000000..386c419 --- /dev/null +++ b/src/nodes/QRCodeGenerator.ts @@ -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 { + 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; + } +} diff --git a/src/nodes/index.ts b/src/nodes/index.ts index c40bcad..98ec11e 100644 --- a/src/nodes/index.ts +++ b/src/nodes/index.ts @@ -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';