2014-04-18 13 views
15

Mam DataURL z płótna, które pokazuje moją kamerę internetową. Zmieniam to daneURL w blob używając odpowiedzi Matta stąd: How to convert dataURL to file object in javascript?HTML5/Javascript - DataURL do Blob & Blob do DataURL

Jak przekonwertować ten obiekt typu blob z powrotem na tę samą wartość DataURL? Spędziłem dzień na badaniu tego i jestem zdumiony, że to nie jest udokumentowane lepiej, chyba że jestem ślepy.

EDIT: Jest

var urlCreator = window.URL || window.webkitURL; 
var imageUrl = urlCreator.createObjectURL(blob); 

ale to tylko zwraca bardzo krótki adres URL, który wydaje się wskazywać na pliku lokalnego, ale muszę wysłać dane kamery w sieci.

+1

Lub jeśli ktoś wie o dwóch innych metodach konwersji pomiędzy DataURL i Blob, byłbym bardzo wdzięczny. To mnie dręczy. – spacecoyote

+1

Czy można nawet zamienić adres URL na obiekt typu blob, wysłać obiekt typu blob za pośrednictwem sieci i ponownie zamienić obszar blob w adres URL? Czy mam błąd w myśleniu? – spacecoyote

+1

Ponieważ moje próby kompresowania ciągu dataURL i wysyłania go w ten sposób również się nie udają, pozwolę sobie jeszcze raz to zignorować. – spacecoyote

Odpowiedz

1

Nieważne, skończyło się to po tym, jak trzymałem się instrukcji z tego wątku Display image from blob using javascript and websockets i ustawiłem serwer na surowym (jeszcze) niezmodyfikowanym BinaryWebSocketFrames.

Teraz wciąż walczę ze złą wydajnością płótna (< 1fp), ale może to stać się tematem nowego wątku.

30

Użyj mojego kodu do przekonwertowania obiektu dataURL i obiektu blob w javascript. (lepiej niż kod w twoim linku.)

//**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); 
}); 
+0

Działa to świetnie! Dziękuję za podzielenie się. – Jazzy

+0

Myślę, że rzeczą, która nie była dla mnie oczywista w stosunku do 'FileReader' jest dodanie zdarzenia 'onload' przed wywołaniem' readAsDataURL' – Jazzy