744 Stimmen

Wie kann ich ein Bild mit JavaScript in eine Base64-Zeichenkette umwandeln?

Ich muss mein Bild in eine Base64-Zeichenkette umwandeln, damit ich mein Bild an einen Server senden kann.

Gibt es eine JavaScript-Datei für diese Aufgabe? Wie kann ich sie sonst konvertieren?

1195voto

HaNdTriX Punkte 26792

Es gibt mehrere Ansätze, die Sie wählen können:

1. Herangehensweise: FileReader

Laden Sie das Bild als Blob über XMLHttpRequest und verwenden Sie die FileReader API ( readAsDataURL() ), um sie in eine 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)
})

Dieses Codebeispiel könnte auch mit Hilfe der WHATWG implementiert werden API abrufen :

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

Diese Ansätze:

  • fehlende Browserunterstützung

  • eine bessere Kompression haben

  • auch für andere Dateitypen funktionieren

Browser-Unterstützung:


2. Ansatz: Leinwand

Laden Sie das Bild in ein Image-Objekt, malen Sie es auf eine unveränderte Leinwand und konvertieren Sie die Leinwand zurück in eine dataURL.

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

Im Detail

Unterstützte Eingabeformate:

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

Unterstützte Ausgabeformate:

image/png , image/jpeg , image/webp (Chrom)

Browser-Unterstützung:


3. Herangehensweise: Bilder aus dem lokalen Dateisystem

Wenn Sie Bilder aus dem Dateisystem des Benutzers konvertieren möchten, müssen Sie einen anderen Ansatz wählen. Verwenden Sie die 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)" />

233voto

ThiefMaster Punkte 297146

Sie können die HTML5 <canvas> für sie:

Erstellen Sie eine Leinwand, laden Sie Ihr Bild hinein und verwenden Sie dann toDataURL() um die Base64-Darstellung zu erhalten (eigentlich ist es eine data: URL, aber sie enthält das Base64-kodierte Bild).

102voto

Dieses Snippet kann Ihre String-, Bild- und sogar Videodatei in Base64-Stringdaten konvertieren.

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

52voto

mehmet mecek Punkte 2507

Grundsätzlich gilt: Wenn Ihr Bild

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

dann können Sie es wie folgt umwandeln

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

28voto

James Harrington Punkte 3050

Ich habe Folgendes getan:

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

Und so verwenden Sie es

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X