Sử dụng JavaScript để hiển thị Blob


89

Tôi đang truy xuất hình ảnh Blob từ cơ sở dữ liệu và tôi muốn có thể xem hình ảnh đó bằng JavaScript. Đoạn mã sau tạo ra một biểu tượng hình ảnh bị hỏng trên trang:

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

Đây là một jsFiddle chứa tất cả các mã được yêu cầu, bao gồm cả blob. Mã hoàn thành sẽ hiển thị đúng hình ảnh.


Định dạng của đốm màu là gì? Đây có phải là một hình ảnh ở một số định dạng (jpeg, png, gif, v.v.) hay chỉ là các byte RGB?
bjornd

4
Không nên document.createElement('img');thay vìdocument.createElement('image');?
Pablo Lozano

Câu trả lời:


115

Bạn cũng có thể lấy đối tượng BLOB trực tiếp từ XMLHttpRequest. Đặt responseType thành blob tạo ra mẹo nhỏ. Đây là mã của tôi:

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

Và hàm phản hồi trông như thế này:

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

Chúng ta chỉ cần tạo một phần tử hình ảnh trống trong HTML:

<img id="image"/>

22
Dòng quan trọng là dòng urlCreator.createObjectURL(blob)trả về một imageUrl có thể được gán cho một src hình ảnh.
Agent47DarkSoul

7
Đừng quên thu hồi URL đã tạo sau khi bạn hoàn tất bằng cách gọi; thu hồiObjectURL
Ralpharoo

Tôi giả sử rằng hình ảnh của OP nằm trong một số loại trường trong db, tức là OP không thể lấy nó trực tiếp . Nếu anh ta có thể làm như vậy, rất có thể anh ta sẽ sử dụng trực tiếpimg thẻ - thay vì thực hiện XHR / tìm nạp; vì cả hai đều dễ bị SOP.
Christian Ulbrich

75

Nếu bạn muốn sử dụng tìm nạp thay thế:

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

Nguồn:

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


Điều này sẽ tự động chuyển đổi base64 như hình ảnh được mã hóa base64?
P Satish Patro

2
Tôi yêu bạn .. tôi đã dành 4 giờ để cố gắng giải quyết cho đến khi tôi tìm thấy nó.
tinyCoder

Điều gì xảy raif (typeof URL !== "function") {}
zanderwar

19

Bạn có thể chuyển đổi chuỗi của mình thành Uint8Array để lấy dữ liệu thô. Sau đó, tạo một Blob cho dữ liệu đó và chuyển tới URL.createObjectURL (blob) để chuyển Blob thành một URL mà bạn chuyển tới img.src .

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

Bạn có thể thử ví dụ hoàn chỉnh tại: http://jsfiddle.net/nj82y73d/


14

Trong ví dụ của bạn, bạn nên làm như vậy createElement('img').

Trong liên kết của bạn base64blob != Base64.encode(blob),.

Điều này hoạt động, miễn là dữ liệu của bạn hợp lệ http://jsfiddle.net/SXFwP/ (Tôi không có bất kỳ hình ảnh BMP nào nên tôi phải sử dụng PNG).


Điểm tốt trên img. Bạn nên lưu ý rằng 'img' là một phần tử hình ảnh html trong đó 'hình ảnh' là phần tử đầu vào html của loại hình ảnh, mặc dù trong trường hợp này, nó không tạo ra sự khác biệt. Tôi giả định rằng dữ liệu hình ảnh hợp lệ, vì nó đến từ nguồn của bên thứ ba. Bạn có biết cách kiểm tra này không? Hoặc một trang web dễ dàng cung cấp các đốm màu từ hình ảnh tải lên? Tôi muốn kiểm tra BMP's
GAgnew

"Blob" trong fiddle của bạn thực ra không phải là Blob. Bạn đã sử dụng một chuỗi được mã hóa base64.
elliotwesoff

5

Tôi đoán bạn đã gặp lỗi trong mã nội tuyến của hình ảnh của bạn. Thử đi :

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

Liên kết hữu ích: http://dean.edwards.name/my/base64-ie.html


3

Vấn đề là tôi có dữ liệu thập lục phân cần được chuyển đổi sang nhị phân trước khi được mã hóa base64.

trong PHP:

base64_encode(pack("H*", $subvalue))

0

Trong lần thử nghiệm, đốm màu của bạn không phải là một đốm màu, nó là một chuỗi biểu diễn dữ liệu thập lục phân. Hãy thử điều này trên một đốm màu và bạn đã hoàn thành

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 cung cấp cho bạn hình ảnh được mã hóa base64 sẵn sàng cho bạn phần tử hình ảnh () nguồn (src)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.