HTML5 / Javascript - DataURL для BLOB-объектов и BLOB-объектов для DataURL
У меня есть DataURL с холста, который показывает мою веб-камеру. Я превращаю этот dataURL в большой двоичный объект, используя ответ Мэтта отсюда: Как преобразовать dataURL в объект файла в javascript?
Как мне преобразовать этот BLOB-объект обратно в тот же DataURL? Я провел целый день, исследуя это, и я удивлен, что это не документировано лучше, если я не слепой.
РЕДАКТИРОВАТЬ: есть
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(blob);
но он возвращает только очень короткий URL, который, кажется, указывает на локальный файл, но мне нужно отправить данные веб-камеры по сети.
5 ответов
Несмотря ни на что, он закончил работать после того, как придерживался инструкций в этой теме. Отображение изображения из BLOB-объекта с использованием javascript и websockets и превращение моего сервера в необработанный (пока) неизмененный BinaryWebSocketFrames.
Сейчас я все еще борюсь с плохим исполнением холста (<1fp), но это может стать предметом новой темы.
Используйте мой код для преобразования между dataURL и BLOB-объектами в JavaScript. (лучше, чем код в вашей ссылке.)
//**dataURL to blob**
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
//**blob to dataURL**
function blobToDataURL(blob, callback) {
var a = new FileReader();
a.onload = function(e) {callback(e.target.result);}
a.readAsDataURL(blob);
}
//test:
var blob = dataURLtoBlob('data:text/plain;base64,YWFhYWFhYQ==');
blobToDataURL(blob, function(dataurl){
console.log(dataurl);
});
Вот
Promise
версия на основе Typescript с надлежащей проверкой ошибок.
function blobToDataURL(blob: Blob): Promise<string> {
return new Promise<string>((resolve, reject) => {
const reader = new FileReader();
reader.onload = _e => resolve(reader.result as string);
reader.onerror = _e => reject(reader.error);
reader.onabort = _e => reject(new Error("Read aborted"));
reader.readAsDataURL(blob);
});
}
DataURL to Blob имеет лучшее решение:
const dataURL = "dataURL string...";
const res = await fetch(dataURL);
const blob = await res.blob();
Мне нравятся остроты, так что вот
Promise
-основанный для преобразования большого двоичного объекта в URL-адрес данных:
let blob = ...;
let dataUrl = await new Promise(r => {let a=new FileReader(); a.onload=r; a.readAsDataURL(blob)}).then(e => e.target.result);
Или, как функция:
function blobToDataUrl(blob) {
return new Promise(r => {let a=new FileReader(); a.onload=r; a.readAsDataURL(blob)}).then(e => e.target.result);
}
let dataUrl = await blobToDataUrl(blob);