2013-02-19 16 views
7

मैं एक छवि को एन्कोड और डीकोड करने की कोशिश कर रहा हूं। मैं छवि को base64 में बदलने के लिए FileReader की readAsDataURL विधि का उपयोग कर रहा हूं। फिर इसे वापस बदलने के लिए मैंने readAsBinaryString() और atob() का उपयोग करके कोई भाग्य नहीं लिया है। क्या बेस 64 एन्कोडिंग के बिना छवियों को जारी रखने का कोई और तरीका है?बेस 64 ब्रेक छवि के साथ एन्कोड/डीकोड छवि

readAsBinaryString()

Starts reading the contents of the specified Blob, which may be a File. When the read operation is finished, the readyState will become DONE, and the onloadend callback, if any, will be called. At that time, the result attribute contains the raw binary data from the file.

कोई विचार क्या मैं यहां गलत कर रहा हूं?

नमूना कोड http://jsfiddle.net/qL86Z/3/

$("#base64Button").on("click", function() { 
    var file = $("#base64File")[0].files[0] 
    var reader = new FileReader(); 

    // callback for readAsDataURL 
    reader.onload = function (encodedFile) { 
     console.log("reader.onload"); 
     var base64Image = encodedFile.srcElement.result.split("data:image/jpeg;base64,")[1]; 
     var blob = new Blob([base64Image],{type:"image/jpeg"}); 
     var reader2 = new FileReader(); 

     // callback for readAsBinaryString 
     reader2.onloadend = function(decoded) { 
      console.log("reader2.onloadend"); 
      console.log(decoded); // this should contain binary format of the image 

      // console.log(URL.createObjectURL(decoded.binary)); // Doesn't work 
     }; 
     reader2.readAsBinaryString(blob); 

     // console.log(URL.createObjectURL(atob(base64Image))); // Doesn't work 

    }; 
    reader.readAsDataURL(file); 
    console.log(URL.createObjectURL(file)); // Works 
}); 

धन्यवाद!

+0

जो ब्राउज़र में इस उदाहरण काम करता है? TypeError: encodedFile.srcElement अपरिभाषित – cIph3r

+0

मैं परीक्षण के लिए क्रोम का उपयोग कर रहा हूं, लेकिन मुझे नवीनतम एंड्रॉइड और आईओएस ब्राउज़र में काम करने की आवश्यकता होगी। – sissonb

उत्तर

13

कुछ और शोध के बाद मुझे here से उत्तर मिला, मुझे मूल रूप से एक सरणी बफर में कच्चे बाइनरी को लपेटने और बाइनरी वर्णों को यूनिकोड में बदलने की आवश्यकता थी।

इस कोड है कि याद आ रही थी, है

var binaryImg = atob(base64Image); 
    var length = binaryImg.length; 
    var ab = new ArrayBuffer(length); 
    var ua = new Uint8Array(ab); 
    for (var i = 0; i < length; i++) { 
     ua[i] = binaryImg.charCodeAt(i); 
    } 

पूर्ण नमूना कोड here

1

URL.createObjectURLBlob (जो File हो सकता है) इसकी तर्क के रूप में अपेक्षा करता है। एक स्ट्रिंग नहीं यही कारण है कि URL.createObjectURL(file) काम करता है।

बजाय, आप एक FileReaderreader कि एक डेटा यूआरएल रूप file पढ़ता पैदा कर रहे हैं तो आप उस डेटा यूआरएल एक और Blob (समान सामग्री के साथ) बनाने के लिए इस्तेमाल करते हैं। और फिर आप बाइनरी स्ट्रिंग को अभी निर्मित blob से reader2 बनाने के लिए भी reader2 बनाएं। हालांकि, न तो base64Image यूआरएल स्ट्रिंग भाग (भले ही btoa - एक बड़ी स्ट्रिंग में डिकोड किया गया हो) न ही decoded.binary स्ट्रिंग URL.createObjectURL पर विस्तृत तर्क हैं!

+0

क्या 'base64Image' को वापस मूल फ़ाइल में परिवर्तित करना संभव है? मैं मूल रूप से 'reader.readAsDataURL (फ़ाइल) को पूर्ववत करने का प्रयास कर रहा हूं; 'readAsBinaryString()' या 'atob()' के साथ करता है। – sissonb

+0

'var blob = new blob ([base64Image], {type:" image/jpeg "}); 'इसे करना चाहिए? 'URL.createObjectURL (blob) आज़माएं;' – Bergi

+0

यह 'URL.createObjectURL (blob) के लिए एक टूटी हुई छवि दिखाता है; 'मैंने यहां जेएसफ़िल्ड अपडेट किया है, http://jsfiddle.net/qL86Z/7/ यहां एक स्क्रीनकास्ट दिखा रहा है टूटी हुई छवि http://screencast.com/t/vVVGNTvo – sissonb