How to convert image into base64 string using javascript
我需要将我的图像转换为base64字符串,以便将图像发送到服务器。有没有这个JS文件…?否则如何转换
有多种方法可供选择:
1。方法:文件阅读器通过xmlhttprequest将图像加载为blob,并使用filereader api将其转换为dataurl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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) }) |
这些方法:
- 缺少浏览器支持
- 压缩效果更好
- 也适用于其他文件类型
浏览器支持:
- http://canius.com/feat=filereader
- http://canius.com/feat=获取
2。方法:画布
将图像加载到图像对象中,将其绘制到未污染的画布上,然后将画布转换回DataURL。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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) } ) |
详细地
支持的输入格式:
支持的输出格式:
浏览器支持:
- http://canius.com/feat=画布
-
IE10 (IE10 just works with same origin images)
三。方法:来自本地文件系统的图像
如果要转换用户文件系统中的图像,则需要采用不同的方法。使用FileReader API:
1 2 3 4 5 6 7 8 | function encodeImageFileAsURL(element) { var file = element.files[0]; var reader = new FileReader(); reader.onloadend = function() { console.log('RESULT', reader.result) } reader.readAsDataURL(file); } |
1 | <input type="file" onchange="encodeImageFileAsURL(this)" /> |
您可以使用HTML5
创建画布,将图像加载到画布中,然后使用
此代码段可以将字符串、图像甚至视频文件转换为base64字符串数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <input id="inputFileToLoad" type="file" onchange="encodeImageFileAsURL();" /> <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); } } |
这是我做的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //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); } |
下面是你如何使用它
1 2 3 | base64( $('input[type="file"]'), function(data){ console.log(data.base64) }) |
基本上,如果你的图像是
1 | <img id='Img1' src='someurl'> |
然后你可以把它转换成
1 2 3 4 5 6 7 8 | 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(); |
如果您有一个文件对象,这个简单的函数将工作:
1 2 3 4 5 6 7 8 | function getBase64 (file,callback) { const reader = new FileReader(); reader.addEventListener('load', () => callback(reader.result)); reader.readAsDataURL(file); } |
使用情况:—
1 2 3 | getBase64(fileObjectFromInput, function(base64Data){ console.log("base 64 of file is",base64Data);//here you can have your code which uses base64 for its operation,//file to base64 by oneshubh }); |
您可以使用FileAPI,但它几乎不受支持。
试试这个代码
文件上传chnage事件ccall此功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $("#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数据存储在隐藏文件中以供使用。
据我所知,image可以通过filereader()转换成base64字符串,或者存储在canvas元素中,然后使用todataurl()获取image,我遇到了类似similar的问题,您可以参考它。
将图像转换为已加载的画布
我发现最安全可靠的方法是使用
演示:图像到base64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <input id="myinput" type="file" onchange="encode();" /> <textarea style="width:100%;height:500px;" id="txt"> </textarea> 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); } } </body> </html> |
好吧,如果您使用的是Dojo,它将为我们提供直接的方法将其编码或解码为base64。
试试这个:
要使用dojox.encoding.base64对字节数组进行编码:
1 | var str = dojox.encoding.base64.encode(myByteArray); |
要解码base64编码的字符串:
1 | var bytes = dojox.encoding.base64.decode(str); |