Verwenden von JavaScript zum Anzeigen eines Blobs

93

Ich rufe ein Blob-Bild aus einer Datenbank ab und möchte dieses Bild mit JavaScript anzeigen können. Der folgende Code erzeugt ein fehlerhaftes Bildsymbol auf der Seite:

var image = document.createElement('image');
    image.src = 'data:image/bmp;base64,'+Base64.encode(blob);
    document.body.appendChild(image);

Hier ist eine jsFiddle, die den gesamten erforderlichen Code enthält, einschließlich des Blobs. Der ausgefüllte Code sollte ein Bild korrekt anzeigen.

GAgnew
quelle
Was ist das Format des Blobs? Ist dies ein Bild in einem bestimmten Format (JPEG, PNG, GIF usw.) oder nur RGB-Bytes?
Björn
5
Sollte es nicht document.createElement('img');statt seindocument.createElement('image');?
Pablo Lozano

Antworten:

119

Sie können das BLOB-Objekt auch direkt von XMLHttpRequest abrufen. Das Setzen von responseType auf blob macht den Trick. Hier ist mein Code:

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost/image.jpg");
xhr.responseType = "blob";
xhr.onload = response;
xhr.send();

Und die Antwortfunktion sieht folgendermaßen aus:

function response(e) {
   var urlCreator = window.URL || window.webkitURL;
   var imageUrl = urlCreator.createObjectURL(this.response);
   document.querySelector("#image").src = imageUrl;
}

Wir müssen nur ein leeres Bildelement in HTML erstellen:

<img id="image"/>
AdamZ
quelle
22
Die wichtige Zeile urlCreator.createObjectURL(blob)gibt eine imageUrl zurück, die einem image src zugewiesen werden kann.
Agent47DarkSoul
7
Vergessen Sie nicht, die erstellte URL zu widerrufen, wenn Sie mit dem Aufruf fertig sind. revokeObjectURL
Ralpharoo
Ich würde annehmen, dass sich das Bild von OP in einem Feld in einer Datenbank befindet, dh OP kann es nicht direkt abrufen . Wenn er dazu in der Lage wäre, würde er höchstwahrscheinlich direkt ein img- Tag verwenden, anstatt XHR / fetch auszuführen. weil beide anfällig für SOP sind.
Christian Ulbrich
77

Wenn Sie stattdessen fetch verwenden möchten:

var myImage = document.querySelector('img');

fetch('flowers.jpg').then(function(response) {
  return response.blob();
}).then(function(myBlob) {
  var objectURL = URL.createObjectURL(myBlob);
  myImage.src = objectURL;
});

Quelle:

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

Ogglas
quelle
Wird base64 automatisch konvertiert, wenn das Image base64-codiert ist?
P Satish Patro
2
Ich liebe dich. Ich habe 4 Stunden lang versucht zu lösen, bis ich das gefunden habe.
tinyCoder
Was passiertif (typeof URL !== "function") {}
Zanderwar
19

Sie können Ihre Zeichenfolge in ein Uint8Array konvertieren , um die Rohdaten abzurufen . Erstellen Sie dann einen Blob für diese Daten und übergeben Sie ihn an URL.createObjectURL (Blob) , um den Blob in eine URL zu konvertieren, die Sie an img.src übergeben .

var data = '424D5E070000000000003E00000028000000EF...';

// Convert the string to bytes
var bytes = new Uint8Array(data.length / 2);

for (var i = 0; i < data.length; i += 2) {
    bytes[i / 2] = parseInt(data.substring(i, i + 2), /* base = */ 16);
}

// Make a Blob from the bytes
var blob = new Blob([bytes], {type: 'image/bmp'});

// Use createObjectURL to make a URL for the blob
var image = new Image();
image.src = URL.createObjectURL(blob);
document.body.appendChild(image);

Das vollständige Beispiel finden Sie unter: http://jsfiddle.net/nj82y73d/

nkron
quelle
14

In Ihrem Beispiel sollten Sie createElement('img').

In Ihrem Link , base64blob != Base64.encode(blob).

Dies funktioniert, solange Ihre Daten gültig sind http://jsfiddle.net/SXFwP/ (Ich hatte keine BMP-Bilder, also musste ich PNG verwenden).

Nachito
quelle
Guter Punkt auf der img. Sie sollten beachten, dass 'img' ein HTML-Bildelement ist, wobei 'image' ein HTML-Eingabeelement vom Typ image ist, obwohl dies in diesem Fall keinen Unterschied machte. Ich gehe davon aus, dass die Bilddaten sind gültig, da es aus einer 3rd - Party - Quelle kommt. Wissen Sie überhaupt, wie man das testet? Oder eine einfache Seite, die Blobs aus hochgeladenen Bildern gibt? Ich möchte BMP's testen
GAgnew
Der "Blob" in Ihrer Geige ist eigentlich kein Blob. Sie haben eine Base64-codierte Zeichenfolge verwendet.
Elliotwesoff
5

Ich denke, Sie hatten einen Fehler im Inline-Code Ihres Bildes. Versuche dies :

var image = document.createElement('img');
    
image.src="data:image/gif;base64,R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==";
    
image.width=100;
image.height=100;
image.alt="here should be some image";
    
document.body.appendChild(image);

Hilfreicher Link: http://dean.edwards.name/my/base64-ie.html

marius_neo
quelle
3

Das Problem war, dass ich hexadezimale Daten hatte, die vor der Base64-Codierung in Binärdaten konvertiert werden mussten.

in PHP:

base64_encode(pack("H*", $subvalue))
GAgnew
quelle
0

In der Geige ist Ihr Blob kein Blob, sondern eine Zeichenfolgendarstellung von hexadezimalen Daten. Versuchen Sie dies auf einem Blob und fertig

var image = document.createElement('img');
let reader=new FileReader()
reader.addEventListener('loadend',()=>{
  let contents=reader.result
  image.src = contents
  document.body.appendChild(image);
})
if(blob instanceof Blob) reader.readAsDataURL(blob)

readAsDataURL gibt Ihnen ein Base64-codiertes Bild, das für Ihre image element () -Quelle (src) bereit ist.

Bruno
quelle