Convertir des données png base64 en objets de fichier javascript

J'ai deux png encodés base64, et je veux les comparer à l'aide de cette bibliothèque: https://github.com/Huddle/Resemble.js

Je pense que la meilleure façon de le faire est de convertir les png en objets de fichiers à l'aide de FileReader, mais je ne peux pas comprendre comment 🙁

Des pensées?

Je vous remercie!

Vous pouvez créer un Blob partir de vos données base64, puis lisez-le comme asDataURL :

 var img_b64 = canvas.toDataURL('image/png'); var png = img_b64.split(',')[1]; var the_file = new Blob([window.atob(png)], {type: 'image/png', encoding: 'utf-8'}); var fr = new FileReader(); fr.onload = function ( oFREvent ) { var v = oFREvent.target.result.split(',')[1]; // encoding is messed up here, so we fix it v = atob(v); var good_b64 = btoa(decodeURIComponent(escape(v))); document.getElementById("uploadPreview").src = "data:image/png;base64," + good_b64; }; fr.readAsDataURL(the_file); 

Exemple complet ( inclut le code indésirable et le journal de la console ): http://jsfiddle.net/tTYb8/


Alternativement, vous pouvez utiliser .readAsText , cela fonctionne bien, et c'est plus élégant … mais pour une raison quelconque, le texte ne semble pas correct;)

 fr.onload = function ( oFREvent ) { document.getElementById("uploadPreview").src = "data:image/png;base64," + btoa(oFREvent.target.result); }; fr.readAsText(the_file, "utf-8"); // its important to specify encoding here 

Exemple complet: http://jsfiddle.net/tTYb8/3/

Chemin 1 : ne fonctionne que pour donnéesURL, pas pour d'autres types d'url.

 function dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, {type:mime}); } //Usage example: var file = dataURLtoFile('data:image/png;base64,......', 'a.png'); console.log(file); 

Chemin 2 : fonctionne pour n'importe quel type d'url, (http url, dataURL, blobURL, etc …)

 //return a promise that resolves with a File instance function urltoFile(url, filename, mimeType){ return (fetch(url) .then(function(res){return res.arrayBuffer();}) .then(function(buf){return new File([buf], filename, {type:mimeType});}) ); } //Usage example: urltoFile('data:image/png;base64,......', 'a.png', 'image/png') .then(function(file){ console.log(file); }) 

Les deux fonctionnent dans Chrome et Firefox.

La réponse précédente ne m'a pas fonctionné.

Mais cela a parfaitement fonctionné. Convertir l'URI des données en fichier puis ajouter à FormData