मैं जावास्क्रिप्ट का उपयोग करके किसी छवि को बेस 64 स्ट्रिंग में कैसे बदल सकता हूं?


500

मुझे अपनी छवि को बेस 64 स्ट्रिंग में बदलने की आवश्यकता है ताकि मैं अपनी छवि को एक सर्वर पर भेज सकूं।

क्या इसके लिए कोई जावास्क्रिप्ट फाइल है? और, मैं इसे कैसे बदल सकता हूं?


5
आपकी छवि कहाँ से आती है?
TJHeuvel


जवाबों:


182

आप इसके लिए HTML5 का उपयोग कर सकते हैं <canvas>:

एक कैनवास बनाएं, उसमें अपनी छवि लोड करें और फिर उपयोग करें toDataURL() बेस 64 प्रतिनिधित्व प्राप्त करने के लिए करें (वास्तव में, यह एक data:URL है, लेकिन इसमें बेस 64-एन्कोडेड छवि है)।


3
क्या toDataURLकॉलबैक पर नियंत्रण देना जैसे कि done/fail/alwaysxhr के लिए मामला है?
जेरोइन

क्या हम एकल PNG के रूप में 2 या अधिक कैनवस निकाल सकते हैं?
Techie_28

139
क्या आप कृपया jsbin बना सकते हैं या कम से कम कुछ कोड यहाँ लिख सकते हैं?
vsync

9
यह दृष्टिकोण कॉर्स उल्लंघन के मामले में विफल रहता है। इसके अलावा, इस समाधान को प्रश्न को संबोधित करना चाहिए।
रेवंत कुमार


851

कई दृष्टिकोण हैं जिन्हें आप चुन सकते हैं:

1. दृष्टिकोण: FileReader

के माध्यम से ब्लॉब के रूप में छवि लोड XMLHttpRequest और प्रयोग FileReader एपीआई यह एक में बदलने के लिए dataURL :

function toDataURL(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.onload = function() {
    var reader = new FileReader();
    reader.onloadend = function() {
      callback(reader.result);
    }
    reader.readAsDataURL(xhr.response);
  };
  xhr.open('GET', url);
  xhr.responseType = 'blob';
  xhr.send();
}

toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) {
  console.log('RESULT:', dataUrl)
})

इस कोड उदाहरण को WHATWG भ्रूण API का उपयोग करके भी लागू किया जा सकता है :

const toDataURL = url => fetch(url)
  .then(response => response.blob())
  .then(blob => new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onloadend = () => resolve(reader.result)
    reader.onerror = reject
    reader.readAsDataURL(blob)
  }))


toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0')
  .then(dataUrl => {
    console.log('RESULT:', dataUrl)
  })

ये दृष्टिकोण:

  • ब्राउज़र समर्थन में कमी
  • बेहतर संपीड़न है
  • अन्य फ़ाइल प्रकारों के लिए भी काम करते हैं

ब्राउज़र समर्थन:


2. दृष्टिकोण: कैनवास

छवि को एक छवि-ऑब्जेक्ट में लोड करें, इसे एक गैर-प्राप्त कैनवास पर पेंट करें और कैनवास को वापस डेटाूर में परिवर्तित करें।

function toDataURL(src, callback, outputFormat) {
  var img = new Image();
  img.crossOrigin = 'Anonymous';
  img.onload = function() {
    var canvas = document.createElement('CANVAS');
    var ctx = canvas.getContext('2d');
    var dataURL;
    canvas.height = this.naturalHeight;
    canvas.width = this.naturalWidth;
    ctx.drawImage(this, 0, 0);
    dataURL = canvas.toDataURL(outputFormat);
    callback(dataURL);
  };
  img.src = src;
  if (img.complete || img.complete === undefined) {
    img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
    img.src = src;
  }
}

toDataURL(
  'https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0',
  function(dataUrl) {
    console.log('RESULT:', dataUrl)
  }
)

विस्तार से

समर्थित इनपुट प्रारूप:

image/png, image/jpeg, image/jpg, image/gif, image/bmp, image/tiff, image/x-icon, image/svg+xml, image/webp,image/xxx

समर्थित आउटपुट स्वरूप:

image/png, image/jpeg, image/webp(क्रोम)

ब्राउज़र समर्थन:

  • http://caniuse.com/#feat=canvas
  • इंटरनेट एक्सप्लोरर 10 (इंटरनेट एक्सप्लोरर 10 सिर्फ एक ही मूल चित्रों के साथ काम करता है)


3. दृष्टिकोण: स्थानीय फ़ाइल सिस्टम से छवियाँ

यदि आप उपयोगकर्ताओं को फ़ाइल सिस्टम से छवियों को परिवर्तित करना चाहते हैं, तो आपको एक अलग दृष्टिकोण लेने की आवश्यकता है। FileReader API का उपयोग करें :

function encodeImageFileAsURL(element) {
  var file = element.files[0];
  var reader = new FileReader();
  reader.onloadend = function() {
    console.log('RESULT', reader.result)
  }
  reader.readAsDataURL(file);
}
<input type="file" onchange="encodeImageFileAsURL(this)" />


56
मेरे लिए क्रोम में काम नहीं करना:Image from origin **** has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fiddle.jshell.net' is therefore not allowed access.
डिकीबॉय

5
यदि यह यात्रा किसी और के साथ होती है, तो इस दिनचर्या में "डेटा: इमेज / jpg; बेस64," शीर्षक शामिल होता है, ताकि आप इसे वापस ले सकें।
क्रिस रे

1
Warnin2: कुछ सामग्री के साथ खिलवाड़ करता है। रास्ते में कहीं भी, एक मौका है कि डेटा दूषित / परिवर्तित हो जाता है (भले ही, शायद बहुत ज्यादा नहीं), कम से कम मेरे लिए फ़ायरफ़ॉक्स 35 पर कुछ छवियों पर होता है, बेस 64 आधार से भिन्न होता है जो php उसी पर बनाता है छवि।
हैंश्रानिक

1
हाँ यह सही है। कुछ डेटा खो सकते हैं क्योंकि हम वास्तव में एक कैनवास तत्व ( developer.mozilla.org/en-US/docs/Web/API/… ) पर चित्र बनाते हैं और फिर इसे dataURL ( developer.mozilla.org/en- ) में परिवर्तित करते हैं। यूएस / डॉक्स / वेब / एपीआई / HTMLCanvasElement /… )।
HaNdTriX

1
दृष्टिकोण: FileReader (2) दृष्टिकोण कैनवास की तुलना में अधिक तेज़ी से काम करता है। बड़ी तस्वीरों पर परीक्षण किया गया। आशा है कि यह कुछ के लिए उपयोगी होगा।
मैक्स

83

यह स्निपेट आपकी स्ट्रिंग, छवि और यहां तक ​​कि वीडियो फ़ाइल को बेस 64 स्ट्रिंग डेटा में बदल सकता है।

<input id="inputFileToLoad" type="file" onchange="encodeImageFileAsURL();" />
<div id="imgTest"></div>
<script type='text/javascript'>
  function encodeImageFileAsURL() {

    var filesSelected = document.getElementById("inputFileToLoad").files;
    if (filesSelected.length > 0) {
      var fileToLoad = filesSelected[0];

      var fileReader = new FileReader();

      fileReader.onload = function(fileLoadedEvent) {
        var srcData = fileLoadedEvent.target.result; // <--- data: base64

        var newImage = document.createElement('img');
        newImage.src = srcData;

        document.getElementById("imgTest").innerHTML = newImage.outerHTML;
        alert("Converted Base64 version is " + document.getElementById("imgTest").innerHTML);
        console.log("Converted Base64 version is " + document.getElementById("imgTest").innerHTML);
      }
      fileReader.readAsDataURL(fileToLoad);
    }
  }
</script>


3
न केवल यह बहुत अच्छा है, इससे क्रॉसडोमेन मूल समस्या भी दूर हो जाती है! इसके साथ, आप उपयोगकर्ताओं को URL से अपनी स्वयं की छवियों या छवियों की आपूर्ति करने की अनुमति दे सकते हैं (क्योंकि विंडोज इसे अपने दम पर प्राप्त करेगा), उन्हें कैनवास पर आकर्षित करें, और अभी भी उपयोग करने में सक्षम होने के साथ उनके साथ काम करें ।toDataURL () आदि। आपका बहुत बहुत धन्यवाद!
ElDoRado1239

नमस्कार, यह कैसे पार डोमेन मुद्दों का सामना किए बिना एक दूरस्थ url से भरी छवि पर लागू किया जा सकता है? धन्यवाद
guthik

यह क्रोम 78.0.3904.97 में कभी-कभी काम करता है, लेकिन अन्य बार यह टैब को क्रैश कर देता है।
Dshiz

28

असल में, अगर आपकी छवि है

<img id='Img1' src='someurl'>

तो आप इसे बदल सकते हैं

var c = document.createElement('canvas');
var img = document.getElementById('Img1');
c.height = img.naturalHeight;
c.width = img.naturalWidth;
var ctx = c.getContext('2d');

ctx.drawImage(img, 0, 0, c.width, c.height);
var base64String = c.toDataURL();

5
दुर्भाग्य से यह केवल स्थानीय छवियों के लिए काम करेगा, यदि आप इसे रिमोट इमेज (वेब ​​से एक का चयन करें) का उपयोग करने की कोशिश करते हैं, तो यह इसे (फ़ायरफ़ॉक्स) कंसोल पर लिखता है: 'SecurityError: ऑपरेशन असुरक्षित है'।
user2677034

1
यह अन्य छवियों पर काम कर सकता है, लेकिन उस साइट की कोर सेटिंग पर निर्भर करता है और इसे निर्दिष्ट किया जाना चाहिए<img id='Img1' src='someurl' crossorigin='anonymous'>
माइक

फ़ायरफ़ॉक्स पर आप अस्थायी रूप से उस सुरक्षा को अक्षम कर सकते हैं। गोटो "के बारे में: विन्यास" और संपत्ति को बदलने के लिए "privacy.file_unique_origin" झूठी
मैनुअल रोमेरो

21

मैंने जो किया था यह रहा:

// Author James Harrington 2014
function base64(file, callback){
  var coolFile = {};
  function readerOnload(e){
    var base64 = btoa(e.target.result);
    coolFile.base64 = base64;
    callback(coolFile)
  };

  var reader = new FileReader();
  reader.onload = readerOnload;

  var file = file[0].files[0];
  coolFile.filetype = file.type;
  coolFile.size = file.size;
  coolFile.filename = file.name;
  reader.readAsBinaryString(file);
}

और यहां बताया गया है कि आप इसका उपयोग कैसे करते हैं

base64( $('input[type="file"]'), function(data){
  console.log(data.base64)
})

6
क्या बात है? :)
अलेक्जेंडर मिल्स


14

मैंने पाया कि इसका उपयोग करने का सबसे सुरक्षित और विश्वसनीय तरीका है FileReader()

डेमो: बेस 64 के लिए छवि

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <input id="myinput" type="file" onchange="encode();" />
    <div id="dummy">
    </div>
    <div>
      <textarea style="width:100%;height:500px;" id="txt">
      </textarea>
    </div>
    <script>
      function encode() {
        var selectedfile = document.getElementById("myinput").files;
        if (selectedfile.length > 0) {
          var imageFile = selectedfile[0];
          var fileReader = new FileReader();
          fileReader.onload = function(fileLoadedEvent) {
            var srcData = fileLoadedEvent.target.result;
            var newImage = document.createElement('img');
            newImage.src = srcData;
            document.getElementById("dummy").innerHTML = newImage.outerHTML;
            document.getElementById("txt").value = document.getElementById("dummy").innerHTML;
          }
          fileReader.readAsDataURL(imageFile);
        }
      }
    </script>
  </body>
</html>

6

यदि आपके पास कोई फ़ाइल ऑब्जेक्ट है, तो यह सरल कार्य करेगा:

function getBase64 (file, callback) {

    const reader = new FileReader();

    reader.addEventListener('load', () => callback(reader.result));

    reader.readAsDataURL(file);
}

उपयोग उदाहरण:

getBase64(fileObjectFromInput, function(base64Data){
    console.log("Base64 of file is", base64Data); // Here you can have your code which uses Base64 for its operation, // file to Base64 by oneshubh
});


4

जहाँ तक मुझे पता है, एक छवि को बेस 64 स्ट्रिंग में या तो फाइलराइडर () द्वारा परिवर्तित किया जा सकता है या इसे कैनवास तत्व में संग्रहीत किया जा सकता है और फिर छवि प्राप्त करने के लिए toDataURL () का उपयोग कर सकते हैं। मुझे इस तरह की समस्या थी आप इसका उल्लेख कर सकते हैं।

एक छवि को कैनवास में परिवर्तित करें जो पहले से लोड है


4

इस कोड को आज़माएं:

फ़ाइल अपलोड परिवर्तन ईवेंट के लिए, इस फ़ंक्शन को कॉल करें:

$("#fileproof").on('change', function () {
    readImage($(this)).done(function (base64Data) { $('#<%=hfimgbs64.ClientID%>').val(base64Data); });
});

function readImage(inputElement) {
    var deferred = $.Deferred();

    var files = inputElement.get(0).files;

    if (files && files[0]) {
        var fr = new FileReader();
        fr.onload = function (e) {
            deferred.resolve(e.target.result);
        };
        fr.readAsDataURL(files[0]);
    } else {
        deferred.resolve(undefined);
    }

    return deferred.promise();
}

Base64 डेटा को उपयोग करने के लिए छिपे हुए स्टोर में रखें।


1
हाय रवि! मैं देख रहा हूं कि आप अपेक्षाकृत नए हैं। जब तक मूल पोस्टर विशेष रूप से एक पुस्तकालय समाधान के लिए नहीं पूछता है जैसे कि jQuery, लॉश और इतने पर, यह सभी के लिए बेहतर है कि वे नंगे न्यूनतम का उपयोग करके जवाब दें, इस मामले में, सादे जावास्क्रिप्ट। यदि आप अभी भी jQuery के साथ योगदान करना चाहते हैं, तो कृपया इसे अपनी प्रविष्टि में स्पष्ट रूप से स्पष्ट कर दें :)
Carles Alcolea


0

ठीक है, यदि आप Dojo टूलकिट का उपयोग कर रहे हैं, तो यह हमें Base64 में एन्कोड या डिकोड करने का एक सीधा तरीका देता है।

इसे इस्तेमाल करे:

Dojox.encoding.base64 का उपयोग करके बाइट्स के एक सरणी को एनकोड करने के लिए:

var str = dojox.encoding.base64.encode(myByteArray);

बेस 64-एन्कोडेड स्ट्रिंग को डीकोड करने के लिए:

var bytes = dojox.encoding.base64.decode(str);

2
@DownVoter - यदि आप कुछ नकारात्मक चिह्नित कर रहे हैं, तो त्रुटि को इंगित करना बेहतर है। ताकि कोई सुधर सके। जहाँ तक मैं भी dojo को एक जावास्क्रिप्ट लाइब्रेरी में समझ रहा हूँ तो यदि आपको dojo का उपयोग करने की अनुमति है, तो आप निश्चित रूप से इस दृष्टिकोण का उपयोग कर सकते हैं।
विकाश पांडेय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.