Використання JavaScript для відображення Blob


89

Я отримую Blob-зображення із бази даних, і я хотів би мати можливість переглянути це зображення за допомогою JavaScript. Наступний код видає на сторінці піктограму непрацездатного зображення:

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

Ось jsFiddle, що містить весь необхідний код, включаючи BLOB. Заповнений код повинен правильно відображати зображення.


Який формат краплі? Це зображення в якомусь форматі (jpeg, png, gif тощо) чи просто RGB-байти?
bjornd

4
Хіба не document.createElement('img');замість цьогоdocument.createElement('image');?
Пабло Лозано

Відповіді:


115

Ви також можете отримати BLOB-об'єкт безпосередньо з XMLHttpRequest. Встановлення хитрості для responseType робить фокус. Ось мій код:

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"/>

22
Важливим рядком є ​​той, urlCreator.createObjectURL(blob)який повертає imageUrl, який можна призначити зображенню src.
Agent47DarkSoul

7
Не забудьте відкликати створену URL-адресу, коли закінчите з нею, зателефонувавши; revokeObjectURL
Ralpharoo

Я вважаю, що зображення OP знаходиться в якомусь полі в дБ, тобто OP не може отримати його безпосередньо . Якби він зміг це зробити, швидше за все, він би використовував img- тег безпосередньо замість того, щоб робити XHR / fetch; оскільки обидва схильні до СОП.
Крістіан Ульбріх

75

Якщо ви хочете використовувати замість цього вибірку:

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?
P

2
Я люблю тебе .. Я витратив 4 години, намагаючись вирішити, поки не знайшов цього.
tinyCoder

Що відбуваєтьсяif (typeof URL !== "function") {}
zanderwar

19

Ви можете перетворити свій рядок на Uint8Array, щоб отримати необроблені дані. Потім створіть Blob для цих даних і перейдіть до URL.createObjectURL (blob), щоб перетворити Blob в URL-адресу, яку ви передаєте 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);

Ви можете спробувати повний приклад за адресою: http://jsfiddle.net/nj82y73d/


14

У вашому прикладі ви повинні createElement('img').

У вашому посиланню, base64blob != Base64.encode(blob).

Це працює, якщо ваші дані дійсні http://jsfiddle.net/SXFwP/ (у мене не було жодних зображень BMP, тому мені довелося використовувати PNG).


Хороший момент на img. Зауважте, що 'img' - це елемент зображення html, де 'image' - це елемент вводу html типу image, хоча в цьому випадку це не мало значення. Я припускаю, що дані зображення є дійсними, оскільки вони надходять від сторонніх джерел. Чи знаєте ви все-таки тестування цього? Або простий сайт, який дає крапку із завантаженого зображення? Я хотів би протестувати BMP
GAgnew

"Крапка" у вашій скрипці насправді не є крапкою. Ви використовували кодований рядок base64.
elliotwesoff

5

Припускаю, у вас сталася помилка у вбудованому коді вашого зображення. Спробуйте це :

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


3

Проблема полягала в тому, що у мене були шістнадцяткові дані, які потрібно було перетворити у двійкові, перш ніж кодувати base64.

в PHP:

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

0

У скрипті ваша крапка не є крапкою, це рядкове представлення шістнадцяткових даних. Спробуйте це на краплі і готово

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 надає вам закодоване зображення base64, готове для вас елемент зображення () джерело (src)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.