diff --git a/components/Form.tsx b/components/Form.tsx index be9206b..5f30517 100644 --- a/components/Form.tsx +++ b/components/Form.tsx @@ -186,7 +186,7 @@ function Form(): JSX.Element { className={`${isCameraOpen ? undefined : "hidden"} rounded-md w-full`}/> diff --git a/package.json b/package.json index adcfebe..f7288a9 100644 --- a/package.json +++ b/package.json @@ -16,14 +16,12 @@ "cbor-js": "^0.1.0", "do-not-zip": "^1.0.0", "file-saver": "^2.0.5", - "jpeg-js": "^0.4.3", "jsqr": "^1.4.0", "next": "^11.1.0", "next-i18next": "^8.5.1", "next-seo": "^4.26.0", "node-fetch": "^2.6.1", "pdfjs-dist": "^2.5.207", - "pngjs": "^6.0.0", "react": "^17.0.2", "react-dom": "^17.0.2", "uuid": "^8.3.2", diff --git a/src/process.ts b/src/process.ts index b2a253d..a38c61e 100644 --- a/src/process.ts +++ b/src/process.ts @@ -1,5 +1,4 @@ import {PayloadBody} from "./payload"; -import {PNG} from 'pngjs' import * as PdfJS from 'pdfjs-dist' import jsQR, {QRCode} from "jsqr"; import {decodeData} from "./decode"; @@ -9,19 +8,21 @@ import {COLORS} from "./colors"; PdfJS.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${PdfJS.version}/pdf.worker.js` export async function getPayloadBodyFromFile(file: File, color: COLORS): Promise { - // Read file - const fileBuffer = await file.arrayBuffer(); - let imageData: ImageData; switch (file.type) { case 'application/pdf': console.log('pdf') + // Read file + const fileBuffer = await file.arrayBuffer(); imageData = await getImageDataFromPdf(fileBuffer) break case 'image/png': - console.log('png') - imageData = await getImageDataFromPng(fileBuffer) + case 'image/jpeg': + case 'image/webp': + case 'image/gif': + console.log(`image ${file.type}`) + imageData = await getImageDataFromImage(file) break default: throw Error('invalidFileType') @@ -81,18 +82,48 @@ export async function getPayloadBodyFromQR(qrCodeResult: Result, color: COLORS): } } -async function getImageDataFromPng(fileBuffer: ArrayBuffer): Promise { - return new Promise(async (resolve, reject) => { - let png = new PNG({filterType: 4}) +function getImageDataFromImage(file: File): Promise { + return new Promise((resolve, reject) => { + const canvas = document.getElementById('canvas'); + const canvasContext = canvas.getContext('2d'); - png.parse(fileBuffer, (error, data) => { - if (error) { - reject(); + // create Image object + const img = new Image(); + + img.onload = () => { + // constrain image to 2 Mpx + const maxPx = 2000000; + let width: number; + let height: number; + if (img.naturalWidth * img.naturalHeight > maxPx) { + const ratio = img.naturalHeight / img.naturalWidth; + width = Math.sqrt(maxPx / ratio); + height = Math.floor(width * ratio); + width = Math.floor(width); + } else { + width = img.naturalWidth; + height = img.naturalHeight; } - resolve(data); - }) - }) + // Set correct canvas width / height + canvas.width = width; + canvas.height = height; + + // draw image into canvas + canvasContext.clearRect(0, 0, width, height); + canvasContext.drawImage(img, 0, 0, width, height); + + // Obtain image data + resolve(canvasContext.getImageData(0, 0, width, height)); + }; + + img.onerror = (e) => { + reject(e); + }; + + // start loading image from file + img.src = URL.createObjectURL(file); + }); } async function getImageDataFromPdf(fileBuffer: ArrayBuffer): Promise { diff --git a/yarn.lock b/yarn.lock index f962123..90b098e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1699,11 +1699,6 @@ jest-worker@^27.0.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jpeg-js@^0.4.3: - version "0.4.3" - resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz" - integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2227,11 +2222,6 @@ platform@1.3.6: resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== -pngjs@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz" - integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== - pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"