js实现base64格式编码图片(通俗,易懂)

场景一:项目assets资源里面的图片本地图片

//项目本地assets资源得本地图片
function imgToBase64(url) {
  const image = new Image();//创建一个图像对象
  image.src = url;//在IE游览器src不能在onload事件得前面
  image.onlood = () => {
    //当image加载完毕后执行得事件
    const convas = document.createElement('canvas');
    canvas.width = image.naturalWidth;
    canvas.height = image.naturalHeight;
    //naturalHeight是元素的自然宽度,它永远不会改变。例如,即使使用 CSS 或 JavaScript 
    //调整图像大小,100px 宽的图像的自然宽度始终为 100px。
    canvas.style.width = `${convas.width / window.devicePixelRatio}px`;//window.devicePixelRatio是设备像素比
    canvas.style.height = `${convas.height / window.devicePixelRatio}px`;
    const ctx = canvas.getContext('2d')
    //Canvas 自身无法绘制任何内容。Canvas 的绘图是使用 JavaScript 操作的。Context 对象就是 JavaScript 操作 Canvas 的接口。
    //使用[CanvasElement].getContext('2d')来获取 2D 绘图上下文
    if(!ctx){
      return null;
    }
    ctx.drawImage(image,0,0);
    const base64 = canvas.toDataURL('image/png');
    //canvas的toDataURL()方法是返回一个包含图片展示的 数据URL。
    //可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为96dpi。
    return base64;
  }
}
//引入项目图片
const imgUrl = require('./images/error.png');
const res = imgToBase64(imgUrl);
console.log('生成base64的图片',res)


场景二:有一个公开的url,比如https//xx.png 或者项目public目录下的图片

  • 使用 ajax + FileReader
  • ajax 异步请求使用XMLHttpRequest、fetch、axios都可以
  • 需要将请求的返回格式 responseType 转成 Blob 格式
  • 这种方法也适用于文件转成 base64
 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);
    });
},
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夕&月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值