我需要将我的图像转换为 Base64 字符串,以便我可以将我的图像发送到服务器。
有没有这方面的 JavaScript 文件?否则,我该如何转换它?
您可以选择多种方法:
1.方法:文件阅读器
通过 XMLHttpRequest 将图像加载为 blob 并使用 FileReader API (readAsDataURL()) 将其转换为 dataURL:
函数 toDataURL(url, 回调) { 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 => { 控制台.log('结果:', dataUrl) })
这些方法:
缺乏浏览器支持
有更好的压缩
也适用于其他文件类型
浏览器支持:
http://caniuse.com/#feat=filereader
http://caniuse.com/#feat=fetch
2.方法:帆布
将图像加载到 Image-Object 中,将其绘制到未污染的画布上并将画布转换回 dataURL。
函数 toDataURL(src, callback, outputFormat) { var img = new Image(); img.crossOrigin = '匿名'; img.onload = function() { var canvas = document.createElement('CANVAS'); var ctx = canvas.getContext('2d');变量数据URL; canvas.height = this.naturalHeight; canvas.width = this.naturalWidth; ctx.drawImage(this, 0, 0); dataURL = canvas.toDataURL(outputFormat);回调(数据URL); }; 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
Internet Explorer 10(Internet Explorer 10 仅适用于同源图像)
3. 方法:来自本地文件系统的图像
如果要从用户文件系统转换图像,则需要采用不同的方法。使用 FileReader API:
函数 encodeImageFileAsURL(element) { var file = element.files[0]; var reader = new FileReader(); reader.onloadend = function() { console.log('RESULT', reader.result) } reader.readAsDataURL(file); }
您可以使用 HTML5 <canvas>
:
创建一个画布,将您的图像加载到其中,然后使用 toDataURL()
获取 Base64 表示(实际上,它是一个 data:
URL,但它包含 Base64 编码的图像)。
toDataURL
是否像 xhr 一样控制诸如 done/fail/always
之类的回调?
reader.readAsDataURL
,使用canvas以这种方式获取base64会增加更多数据,因为使用toDataURL时您可能还会失去所有图像压缩。除非您希望将每个图像都转换为特定格式。当您使用画布时,您还会丢失所有元数据,例如:EXIF、旋转、相机、地理位置等
该片段可以将您的字符串、图像甚至视频文件转换为 Base64 字符串数据。
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.