Преобразовать строку Base64 в Javascript Uint16Array? - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю в приложении Javascript, которое получает массив base64.Этот массив кодирует необработанное изображение размером 16 бит на пиксель.

Таким образом, я хотел бы провести в нем некоторые вычисления.Для этого мне нужно распаковать эту строку Base64 в массиве Uint16Array, чтобы я мог перебирать пиксели и выполнять необходимые вычисления.

Какие у меня есть варианты для этого?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

После нескольких часов поиска решения я нашел способ сделать это:

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.

. Было трудно добиться именно того, что я искал.Но я нашел это.

0 голосов
/ 20 декабря 2018

Вы можете использовать эту функцию, которая преобразует строку 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);
  }));
};
...