আমি কীভাবে জাভাস্ক্রিপ্ট ব্যবহার করে কোনও চিত্রকে বেস 64 স্ট্রিংয়ে রূপান্তর করতে পারি?


500

আমার চিত্রটি একটি বেস 64 স্ট্রিংয়ে রূপান্তর করা দরকার যাতে আমি আমার চিত্রটি একটি সার্ভারে প্রেরণ করতে পারি।

এর জন্য কি কোনও জাভাস্ক্রিপ্ট ফাইল রয়েছে? অন্যথায়, আমি কীভাবে এটি রূপান্তর করতে পারি?


5
আপনার ছবিটি কোথা থেকে এসেছে?
টিজেহিউভেল


উত্তর:


182

আপনি <canvas>এটির জন্য এইচটিএমএল 5 ব্যবহার করতে পারেন :

একটি ক্যানভাস তৈরি করুন, এতে আপনার চিত্রটি লোড করুন এবং তারপরে toDataURL()বেস 64৪ প্রতিনিধিত্ব পেতে ব্যবহার করুন (আসলে এটি একটি data:ইউআরএল, তবে এতে বেস64-এনকোডযুক্ত চিত্র রয়েছে)।


3
কি toDataURLযেমন callbacks উপর দিতে নিয়ন্ত্রণ done/fail/alwaysহিসাবে XHR ক্ষেত্রে দেখা যায়?
জেরোইন

আমরা কি একক পিএনজি হিসাবে 2 বা আরও বেশি ক্যানভাস নিতে পারি?
techie_28

139
আপনি কি দয়া করে একটি জেসবিন তৈরি করতে পারেন বা কমপক্ষে এখানে কিছু কোড লিখতে পারেন?
vsync

9
এই পদ্ধতির সিওআরএস লঙ্ঘনের ক্ষেত্রে ব্যর্থ। তা ছাড়া, এই সমাধানটি প্রশ্নের সমাধান করা উচিত।
রেভন্ত কুমার


851

আপনি চয়ন করতে পারেন একাধিক পদ্ধতি আছে:

1. পদ্ধতির: ফাইলরেডার

এক্সএমএলএইচটিপিআরকুয়েস্টের মাধ্যমে ছবিটি ব্লব হিসাবে লোড করুন এবং এটি একটি ডেটাআরএলতে রূপান্তর করতে ফাইলরিডার এপিআই ব্যবহার করুন :

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(Chrome)

ব্রাউজার সমর্থন:

  • http://caniuse.com/#feat=canvas
  • ইন্টারনেট এক্সপ্লোরার 10 (ইন্টারনেট এক্সপ্লোরার 10 কেবল একই মূল চিত্রের সাথে কাজ করে)


৩. পদ্ধতির: স্থানীয় ফাইল সিস্টেম থেকে চিত্র

আপনি যদি ব্যবহারকারীদের ফাইল সিস্টেম থেকে চিত্রগুলি রূপান্তর করতে চান তবে আপনার আলাদা পদ্ধতির প্রয়োজন। 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
এই ক্ষেত্রে অন্য কাউকে ট্রিপ করার ক্ষেত্রে, এই রুটিনটিতে "ডেটা: চিত্র / জেপিজি; বেস 64," শিরোনামটি ফিরে আসে যাতে এটি আপনাকে যুক্ত করার প্রয়োজন হয় না।
ক্রিস রায়ে

1
ওয়ার্নিন 2: সামগ্রীটির সাথে কিছু গণ্ডগোল। পথে কোথাও কোথাও, ডেটাগুলি দূষিত / পরিবর্তিত হওয়ার সুযোগ রয়েছে (যদিও সম্ভবত খুব বেশি নয়), কিছু ছবিতে ফায়ার ফক্সে আমার জন্য কমপক্ষে এটি ঘটে, পিএইচপি একই ভিত্তিতে বেস 64 তৈরি করে বেস 64 যা বেস 64 এর থেকে আলাদা happens চিত্র।
হানশানরিক

1
হ্যা সেটা ঠিক. কিছুটা তথ্য হারিয়ে যেতে পারে যেহেতু আমরা চিত্রটি আসলে একটি ক্যানভাস এলিমেন্টে বিকাশ করি ( ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / এপিআই / ২) এবং তারপরে এটি একটি ডেটাআরএল ( ডেভেলপার.মোজিলা.আর / মার্কিন / ডক্স / ওয়েব / এপিআই / এইচটিএমএল ক্যানভাস এলিমেন্ট /… )।
HaNdTriX

1
অ্যাপ্রোচ: ফাইলরেডার (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 () ইত্যাদি ব্যবহার করতে সক্ষম হয়ে তাদের সাথে কাজ করতে পারে can অনেক ধন্যবাদ!
ElDoRado1239

হ্যালো, ক্রস ডোমেনের সমস্যার মুখোমুখি না হয়ে কীভাবে এটি দূরবর্তী url থেকে বোঝা একটি চিত্রের ক্ষেত্রে প্রয়োগ করা যেতে পারে? ধন্যবাদ
গুথিক

এটি ক্রোম 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
দুর্ভাগ্যক্রমে এটি কেবল স্থানীয় চিত্রগুলির জন্যই কাজ করবে, যদি আপনি এটি প্রত্যন্ত চিত্র ব্যবহার করার চেষ্টা করেন (ওয়েব থেকে একটি চয়ন করুন) এটি এটি (ফায়ারফক্স) কনসোলটিতে লিখেছে: 'সিকিউরিটিআরআর: অপারেশনটি নিরাপত্তাহীন'।
ব্যবহারকারী2677034

1
এটি অন্যান্য ইমেজ এ কাজ কিন্তু যে সাইটের CORS সেটিংস উপর নির্ভর করে এবং উল্লেখ করা আবশ্যক হতে পারে<img id='Img1' src='someurl' crossorigin='anonymous'>
মাইক

ফায়ারফক্সে আপনি এই সুরক্ষাটি সাময়িকভাবে অক্ষম করতে পারেন। "সম্পর্কে: কনফিগার করুন" এবং সম্পত্তি "গোপনীয়তা.ফাইল_উনিক_রিগিন" মিথ্যাতে যান
ম্যানুয়েল রোমেরো

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



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 স্ট্রিংয়ে রূপান্তরিত হতে পারে এবং তারপরে চিত্রটি পেতে ডেটা URL () ব্যবহার করুন। আমার একই ধরণের সমস্যা ছিল আপনি এটি উল্লেখ করতে পারেন।

ইতিমধ্যে লোড হওয়া কোনও চিত্রকে ক্যানভাসে রূপান্তর করুন


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

গোপনে বেস 64 ডেটা ব্যবহারের জন্য সঞ্চয় করুন।


1
হাই রবি! আমি দেখি আপনি তুলনামূলকভাবে নতুন মূল পোস্টারটি নির্দিষ্টভাবে jQuery, লোডাশ ইত্যাদির মতো কোনও লাইব্রেরির সমাধানের জন্য না জিজ্ঞাসা করে, সবার পক্ষে খালি ন্যূনতম ব্যবহার করে উত্তর দেওয়া ভাল, এই ক্ষেত্রে, সরল জাভাস্ক্রিপ্ট। আপনি যদি এখনও jQuery এর সাথে অবদান রাখতে চান তবে দয়া করে আপনার এন্ট্রিগুলিতে এটি স্পষ্ট করে দিন :)
কার্লস অ্যালকোলেয়া


0

ঠিক আছে, আপনি যদি ডোজো টুলকিট ব্যবহার করছেন তবে এটি আমাদের বেস 64 এ এনকোড বা ডিকোড করার সরাসরি উপায় দেয়।

এটা চেষ্টা কর:

Dojox.encoding.base64 ব্যবহার করে বাইটের একটি অ্যারে এনকোড করতে:

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

একটি বেস 64-এনকোড স্ট্রিংটি ডিকোড করতে:

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

2
@ ডাউনভোটার - আপনি যদি কোনও নেতিবাচক কিছু চিহ্নিত করে থাকেন তবে ত্রুটিটিও দেখানো ভাল Dear যাতে কেউ উন্নতি করতে পারে। যতদূর আমি একটি জাভাস্ক্রিপ্ট লাইব্রেরিতে ডোজো বুঝতে পারি তবে যদি আপনি ডজো ব্যবহারের অনুমতি পান তবে আপনি অবশ্যই এই পদ্ধতিটি ব্যবহার করতে পারেন।
বিকাশ পান্ডে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.