एक बूँद प्रदर्शित करने के लिए जावास्क्रिप्ट का उपयोग करना


96

मैं एक डेटाबेस से एक ब्लॉब छवि प्राप्त कर रहा हूं, और मैं जावास्क्रिप्ट का उपयोग करके उस छवि को देखने में सक्षम होना चाहता हूं। निम्न कोड पृष्ठ पर एक टूटी हुई छवि आइकन बनाता है:

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

यहाँ एक jsField है जिसमें आवश्यक सभी कोड हैं, जिसमें बूँद भी शामिल है। पूर्ण कोड को ठीक से एक छवि प्रदर्शित करनी चाहिए।


बूँद का प्रारूप क्या है? क्या यह किसी प्रारूप (jpeg, png, gif आदि) या बस RGB बाइट्स में एक छवि है?
15

5
यह नहीं होना चाहिए document.createElement('img');के बजायdocument.createElement('image');?
पाब्लो लोज़ानो

जवाबों:


122

आप सीधे XMLHttpRequest से BLOB ऑब्जेक्ट भी प्राप्त कर सकते हैं। Blob को 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"/>

23
महत्वपूर्ण पंक्ति वह है urlCreator.createObjectURL(blob)जो एक छवि प्रतिफल लौटाती है जिसे एक छवि src को सौंपा जा सकता है।
Agent47DarkSoul

7
एक बार जब आप कॉल करके इसे समाप्त कर लें, तो बनाए गए URL को रद्द करना न भूलें; RevokeObjectURL
राल्फारो

मुझे लगता है, कि ओपी की छवि किसी तरह के क्षेत्र में एक DB में है, यानी ओपी सीधे इसे प्राप्त नहीं कर सकता है । यदि वह ऐसा करने में सक्षम होता है, तो वह XHR / fetch करने के बजाय सीधे एक imgटैग का उपयोग करेगा ; क्योंकि दोनों एसओपी के लिए प्रवण हैं।
क्रिश्चियन उलब्रिच

78

यदि आप इसके स्थान पर भ्रूण का उपयोग करना चाहते हैं:

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


क्या यह स्वतः ही बेस 64 को रूपांतरित कर देगा क्योंकि इमेज बेस64 एनकोडेड है?
पी सतीश पात्रो

2
मैं तुमसे प्यार करता हूँ .. मैं 4 घंटे खर्च करने की कोशिश कर रहा था जब तक मुझे यह नहीं मिला।
स्मालकॉडर

क्या होता हैif (typeof URL !== "function") {}
zanderwar

20

आप कच्चे डेटा को प्राप्त करने के लिए अपने स्ट्रिंग को Uint8Array में बदल सकते हैं । फिर उस डेटा के लिए एक बूँद बनाएँ और URL.reateObjectURL (बूँद) को पास करें ताकि बूँद को एक 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 इमेज एलिमेंट है जहाँ 'इमेज' टाइप इमेज का html इनपुट एलिमेंट है, हालाँकि इस मामले में इससे कोई फर्क नहीं पड़ता था। मैं यह सोचते हैं कि छवि डेटा है , वैध के रूप में यह एक 3 पार्टी स्रोत से आ रहा है। क्या आप इसके परीक्षण के बारे में जानते हैं? या एक आसान साइट जो अपलोड की गई छवि से बूँद देती है? मैं
GAgnew

आपके फिडल में "बूँद" वास्तव में एक बूँद नहीं है। आपने एक बेस 64 एन्कोडेड स्ट्रिंग का उपयोग किया।
इलियटवेज़ऑफ़

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

समस्या यह थी कि मेरे पास हेक्साडेसिमल डेटा था जिसे बेस 64 सेंकड होने से पहले बाइनरी में बदलना आवश्यक था।

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 आपको छवि तत्व () स्रोत (src) के लिए तैयार एक base64 एन्कोडेड छवि देता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.