我正在一个接收 base64 数组的 Javascript 应用程序中工作。该数组对每像素 16 位的原始图像进行编码。
因此,我想在其中做一些计算。为此,我需要将这个 Base64 字符串解压缩到 Uint16Array 中,这样我就可以遍历像素并执行所需的计算。
我有什么选择这样做?
我正在一个接收 base64 数组的 Javascript 应用程序中工作。该数组对每像素 16 位的原始图像进行编码。
因此,我想在其中做一些计算。为此,我需要将这个 Base64 字符串解压缩到 Uint16Array 中,这样我就可以遍历像素并执行所需的计算。
我有什么选择这样做?
在寻找解决方案几个小时后,我找到了一种方法:
function getData()
{
fetch("test_data/img_base64.txt")
.then(res => res.text())
.then((out) => {
rawString = window.atob(out);
uint8Array = new Uint8Array(rawString.length);
for(var i = 0; i < rawString.length; i++)
{
uint8Array[i] = rawString.charCodeAt(i);
}
uint16Array = new Uint16Array(uint8Array.buffer);
console.log(uint16Array);
})
.catch(err => { throw err });
}
首先,我从一个文件中获取我的 base64 字符串。然后使用window.atob
它转换为 JavaScript 字符串。在此之后,我需要Uint8Array
用从字符串中加载的每个字节填充一个。最后,我不得不将 thisUint8Array
转换为 final Uint16Array
。
这很难实现我所期待的。但我已经找到了。
您可以使用此函数将 base64 字符串转换为二进制 Uint16 数组
var BASE64_MARKER = ';base64,';
function convertDataURIToBinary(dataURI) {
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint16Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
如果您的目标是 Firefox 并喜欢冒险,您可以将功能缩短为:
var BASE64_MARKER = ';base64,';
function convertDataURIToBinaryFF(dataURI) {
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var raw = window.atob(dataURI.substring(base64Index));
return Uint8Array.from(Array.prototype.map.call(raw, function(x) {
return x.charCodeAt(0);
}));
};