HTMLCanvasElement.toDataURL()
方法返回一个包含图片展示的 data URI 。可以使用type
参数其类型,默认为 PNG 格式。图片的分辨率为 96dpi。
- // 注意图片的,onload是异步的,如果要封装成工具函数,需要用promise包装一下
- async function imgToBase64(url) {
- return new Promise((resolve, reject) => {
- const image = new Image()
- image.src = url
- image.onload = () => {
- const canvas = document.createElement('canvas')
- canvas.width = image.naturalWidth // 使用 naturalWidth 为了保证图片的清晰度
- canvas.height = image.naturalHeight
- canvas.style.width = `${canvas.width / window.devicePixelRatio}px`
- canvas.style.height = `${canvas.height / window.devicePixelRatio}px`
- const ctx = canvas.getContext('2d')
- if (!ctx) {
- return null
- }
- ctx.drawImage(image, 0, 0)
- const base64 = canvas.toDataURL('image/png')
- return resolve(base64)
- }
- image.onerror = (err) => {
- return reject(err);
- }
- })
- }
-
- // 引入项目中的图片
- const imgUrl = require('xxx.png');
- imgToBase64(imgUrl).then(res => {
- if(res) {
- console.log('生成的base64图片', res)
- }
- }).catch(err => {
- console.log('这里是错误', err);
- });
- getBase64(imgUrl) {
- let xhr = new XMLHttpRequest();
- xhr.open('get', '/xxx.jpg', true);
- // 重点1
- xhr.responseType = 'blob';
- xhr.onload = function() {
- if (this.status == 200) {
- //得到一个blob对象
- let blob = this.response;
- // 重点2
- let oFileReader = new FileReader();
- oFileReader.onloadend = function(e) {
- // 结果
- const base64 = e.target.result
- };
- oFileReader.readAsDataURL(blob);
- }
- };
- xhr.send();
- },
使用 fetch api请求,大同小异,重点都是 responseType 要设置为blob,再使用 FileReader 的 readAsDataURL 方法把 blob 转成 base64
- function getBase64(imgUrl) {
- var xhr = new XMLHttpRequest();
- fetch(imgUrl, {
- responseType: 'blob'
- })
- .then(response => {
- return response.blob();
- })
- .then(blob => {
- let oFileReader = new FileReader();
- oFileReader.onloadend = function(e) {
- // base64结果
- const base64 = e.target.result
- };
- oFileReader.readAsDataURL(blob);
- });
- },
发现没有?方法一是用的 HTMLCanvasElement.toDataURL() 和 方法二是用的 FileReader.readAsDataURL() 都有一个【DataURL】,这就说明这个【dataURL】是和base64有关系的,所以,以后无论是文件,还是图片转成base64都需要先想到带有【dataURL】的方法。
Data URL,即前缀为
data:
协议的 URL,其允许内容创建者向文档中嵌入小文件。它们之前被称作“data URI”,直到这个名字被 WHATWG 弃用。bae64的图片/文字就是一种Data URL
请看官方文档