【发布时间】:2019-04-02 13:48:05
【问题描述】:
我正在开发 Angular 应用程序并尝试仅在客户端使用 QR 码解码图像并面临下一个错误。
我有下一个流程:
- 用户上传图片。
- 我从图像中解码二维码。
<input type="file" name="file" id="file" accept="image/*"(change)="qrCodeUploaded($event.target.files)"/>
我已经尝试了下一个库:
qrCodeUploaded(files: FileList): void {
const fileReader = new FileReader();
const codeReader = new BrowserQRCodeReader();
fileReader.readAsDataURL(files[0]);
fileReader.onload = (e: any) => {
var image = document.createElement("img");
image.src = e.target.result;
setTimeout(() => codeReader.decodeFromImage(image, e.target.result).then(res => console.log(res)), 100);
};
}
适用于某些二维码,但在移动设备上存在问题。如果您将使用手机拍摄 QR 码的照片,则不会对其进行解码。因此,对于移动设备,您需要实现视频。
qrCodeUploaded(files: FileList): void {
const fileReader = new FileReader();
fileReader.readAsArrayBuffer(files[0]);
fileReader.onload = (e: any) => {
console.log(new Uint8ClampedArray(e.target.result));
console.log(jsQR(new Uint8ClampedArray(e.target.result), 256, 256));
};
}
我上传的任何 QR 图像都会出现下一个错误:
core.js:15714 ERROR Error: Malformed data passed to binarizer.
at Object.binarize (jsQR.js:408)
at jsQR (jsQR.js:368)
要点链接: https://gist.github.com/er-ant/b5c75c822eb085e70035cf333bb0fb55
请告诉我我做错了什么并提出一些二维码解码的解决方案。打开任何想法:)
【问题讨论】:
-
这和加密有什么关系?
-
你读过the readme here?他们期待ImageData(即像素值),您正在给他们一个图像文件的 ArrayBuffer(即二进制内容)。那是行不通的。要从 Blob 中获取 ImageData,您可以执行
createImageBitmap(blob).then(bmp=> { const ctx = Object.assign(document.createElement('canvas'), bmp).getContext('2d'); ctx.drawImage(bmp, 0,0); return ctx.getImageData(0,0,bmp.width,bmp.height); }) -
@Kaiido 帮助将图像转换为带有用于解析 jpeg 和 png 的库的 ImageData 格式。谢谢。将尝试您的示例并应用答案
-
@Kaiido 应用了您的解决方案并提供了一些更新。谢谢!
标签: javascript encryption qr-code rgba