使用 JavaScript 显示 Blob

IT技术 javascript image base64 blob
2021-02-10 16:52:22

我正在从数据库中检索 Blob 图像,并且希望能够使用 JavaScript 查看该图像。以下代码在页面上生成一个损坏的图像图标:

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

这是一个包含所有所需代码的 jsFiddle,包括 blob。完成的代码应正确显示图像。

6个回答

您还可以直接从 XMLHttpRequest 获取 BLOB 对象。将 responseType 设置为 blob 可以解决问题。这是我的代码:

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

响应函数如下所示:

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

我们只需要在 HTML 中创建一个空的图像元素:

<img id="image"/>
重要的一行是urlCreator.createObjectURL(blob)返回一个可以分配给图像 src 的 imageUrl。
2021-03-27 16:52:22
我假设 OP 的图像位于数据库中的某种字段,即 OP 无法直接获取它如果他能够这样做,他很可能会直接使用img- 标签而不是执行 XHR / fetch;因为两者都容易出现 SOP。
2021-04-01 16:52:22
完成后不要忘记通过调用撤销创建的 URL;撤销对象URL
2021-04-11 16:52:22

如果您想改用 fetch:

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;
});

来源:

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

这会自动转换 base64,因为图像是 base64 编码的吗?
2021-03-25 16:52:22
我爱你……我花了 4 个小时试图解决,直到我找到了这个。
2021-03-25 16:52:22
如果您投反对票,请添加评论原因。否则很难改进答案。
2021-03-25 16:52:22
怎么了 if (typeof URL !== "function") {}
2021-04-11 16:52:22

您可以将字符串转换为Uint8Array以获取原始数据。然后为该数据创建一个Blob并传递给URL.createObjectURL(blob)以将 Blob 转换为您传递给img.src的 URL

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);

您可以在以下位置尝试完整示例:http : //jsfiddle.net/nj82y73d/

在您的示例中,您应该createElement('img').

在您的链接中,base64blob != Base64.encode(blob).

只要您的数据有效http://jsfiddle.net/SXFwP/(我没有任何 BMP 图像,所以我不得不使用 PNG),这就有效

你的小提琴中的“blob”实际上不是一个 Blob。您使用了 base64 编码的字符串。
2021-04-01 16:52:22
img 上的好点。您应该注意到 'img' 是一个 html 图像元素,其中 'image' 是一个图像类型的 html 输入元素,尽管在这种情况下它没有任何区别。我假设图像数据有效的,因为它来自第 3 方来源。你知道测试这个吗?或者一个简单的网站,可以从上传的图像中获取 blob?我想测试 BMP
2021-04-09 16:52:22

我猜你在图像的内联代码中出错了。试试这个 :

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);

有用的链接:http : //dean.edwards.name/my/base64-ie.html