将Base64字符串转换为Javascript Uint16Array?

时间:2018-12-20 12:41:21

标签: javascript base64 uint16 rawimage

我正在一个接收base64数组的Javascript应用程序中工作。该数组对每个像素的原始图像编码16位。

因此,我想在其中进行一些计算。为此,我需要在Uint16Array中解压缩此Base64字符串,以便可以迭代像素并执行所需的计算。

我有什么选择呢?

2 个答案:

答案 0 :(得分:0)

您可以使用此函数将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);
  }));
};

答案 1 :(得分:0)

几个小时寻找解决方案后,我找到了一种方法:

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。最后,我不得不将这个Uint8Array转换为最终的Uint16Array。

要完全达到我的期望很难。但是我找到了。