Преобразовать строку Base64 в Javascript Uint16Array?
Я работаю в приложении Javascript, которое получает массив base64. Этот массив кодирует 16 бит на пиксель необработанного изображения.
Таким образом, я хотел бы сделать некоторые расчеты в нем. Для этого мне нужно распаковать эту строку Base64 в массиве Uint16Array, чтобы я мог перебирать пиксели и выполнять необходимые вычисления.
Какие у меня есть варианты для этого?
2 ответа
После нескольких часов поиска решения я нашел способ сделать это:
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.
Это было сложно достичь именно того, что я искал. Но я нашел это.
Вы можете использовать эту функцию, которая преобразует строку 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);
}));
};