【发布时间】:2019-03-13 16:41:32
【问题描述】:
如何在 React Native 中从文件路径(不是相机)读取 QRCode?我正在使用 react-native v0.57.1
编辑 1:
在@joshkmartinez 的帮助下,我能够编写这个方法:
getImageInfo(path) {
return new Promise(resolve => {
Image.getSize(`file://${path}`, (width, height) => {
ImgToBase64.getBase64String(`file://${path}`).then(base64String => {
var raw = window.atob(base64String);
var rawLength = raw.length;
var imageData = new Uint8ClampedArray(new ArrayBuffer(rawLength));
for (var i = 0; i < rawLength; i++) {
imageData[i] = raw.charCodeAt(i);
}
resolve({
width,
height,
imageData,
});
});
});
})
}
然后调用它:
this.getImageInfo(path).then(imageInfo => {
jsQR(imageInfo.imageData, imageInfo.width, imageInfo.height).then(qrcode => {
console.log(qrcode);
});
});
但是jsQR返回错误Malformed data passed to binarizer
也许我在将文件转换为 Base64 时做错了,我正在使用react-native-image-base64 来转换图像
编辑 2:
经过 2 天的研究,我能够使用 react-native-fs、Buffer 和 jpeg-js 的这种方法转换图像:
decodeImageData(image) {
var imagePath = `${image.filePath}/${image.fileFullName}`;
return new Promise(resolve => {
RNFS.readFile(imagePath, 'base64').then(base64string => {
const imageData = Buffer.from(base64string, 'base64');
var rawImageData = JPEG.decode(imageData);
var clampedArray = new Uint8ClampedArray(rawImageData.data.length);
for (var i = 0; i < rawImageData.data.length; i++) {
clampedArray[i] = rawImageData.data[i];
}
resolve({
width: rawImageData.width,
height: rawImageData.height,
data: clampedArray,
});
});
});
}
才发现 jsQR 无法读取我的任何二维码(它只是向所有二维码返回 null)
我在这里还缺少什么吗?也许在图像的转换、解码等方面?
【问题讨论】:
-
您是从用户的相册中获取图像吗?
-
不,我正在读取手机/sdcard 内的文件夹
-
我发现了一个类似的问题,看看这个答案:stackoverflow.com/a/51921610/8891686
-
感谢 joshkmartinez 的回复,我之前确实看过那篇文章,但我不知道如何将文件转换为 Uint8ClampedArray,您能帮忙吗?
标签: javascript react-native qr-code