9 ответов:
вы можете использовать HTML5
<canvas>для этого:создать холст, загрузить изображение в него, а затем использовать
toDataURL()чтобы получить представление base64 (на самом деле, этоdata:URL, но он содержит изображение в кодировке base64).
есть несколько подходов, которые вы можете выбрать из:
1. Подход: FileReader
загрузите изображение как blob через XMLHttpRequest и с помощью FileReader API преобразован в 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 fetch 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. Подход: Холст
загрузить изображение в объект изображения, нарисуйте его на не испорченном холсте и преобразуйте холст обратно в 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) } )Поддерживаемые форматы входного сигнала:
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
IE10 (IE10 просто работает с теми же изображениями происхождения)
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)" />
этот фрагмент может преобразовать вашу строку, изображение и даже видеофайл в строковые данные base64. Попробуй один раз...
<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>
вот что я сделал
//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) })
в основном, если ваше изображение
<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, 0, 0, c.width, c.height); var base64String = c.toDataURL();
вы могли бы использовать FileAPI, но это в значительной степени не поддерживается.
насколько я знаю, изображение можно преобразовать в строку base64 либо с помощью FileReader (), либо сохранить его в элементе canvas, а затем использовать toDataURL() для получения изображения.У меня была аналогичная проблема, которую вы можете сослаться на это.
попробуйте этот код
загрузка файла chnage событие ccall эта функция
$("#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(); }хранить base64data в скрытом файле для использования.
Ну, если вы используете dojo, это дает нам прямой способ кодирования или декодирования в base64.
попробуйте это:
зашифровать массив байтов, используя библиотеку.кодирование.base64:
var str = dojox.encoding.base64.encode(myByteArray);для декодирования строки в кодировке base64:
var bytes = dojox.encoding.base64.decode(str);
Comments