js将图片转为base64(解决Canvas.toDataURL 图片跨域问题)

本文介绍两种将图片资源转化为Base64编码的方法:一种是在项目中直接转换已有的图片资源,另一种是用户通过浏览器上传图片时实时进行转换。文章详细展示了如何使用JavaScript实现这些功能。

场景一:将项目中的图片资源转为base64

function convertImgToBase64(url, callback) {
        let canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d'),
        img = new Image();
        img.crossOrigin = 'anonymous';//解决Canvas.toDataURL 图片跨域问题
        img.onload = () => {
          canvas.height = img.height;
          canvas.width = img.width;
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
          let ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase(); // 获取到图片的格式
          let dataURL = canvas.toDataURL("image/" + ext); // 得到base64 编码的 dataURL
          callback && callback(dataURL);
          canvas = null;
        };
        img.src = url;
      }

var  baseUrl = ''
convertImgToBase64(this.options.logo, (baseUrl) => {
    baseUrl = baseUrl
})

场景二:将用户本地上传的资源转化,即用户通过浏览器点击文件上传时,将图片资源转化成base64:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <style>

  </style>
</head>

<body>
  <p><input type="file" id="upfile"></p>
  <p><button id="upJS">用原生JS上传</button>
  </div>
  <script>
    function imgFileTobase64() {
      var reader = new FileReader();
      var AllowImgFileSize = 2100000; //上传图片最大值(单位字节)( 2 M = 2097152 B )超过2M上传失败
      var file = document.getElementById('upfile').files[0]
      if (file) {
        //将文件以Data URL形式读入页面
        reader.readAsDataURL(file);
        reader.onload = function (e) {
          //var ImgFileSize = reader.result.substring(reader.result.indexOf(",") + 1).length;//截取base64码部分(可选可不选,需要与后台沟通)
          if (AllowImgFileSize != 0 && AllowImgFileSize < reader.result.length) {
            alert('上传失败,请上传不大于2M的图片!');
            return;
          } else {
            //执行上传操作
            alert(reader.result);
          }
        }
      }
    }
    document.getElementById("upJS").onclick = function () {
      imgFileTobase64()
    }

  </script>
</body>

</html>

### 解决Canvas.toDataURL方法保存图片问题 为了有效解决使用 `Canvas.toDataURL` 方法保存图片时遇到的安全性问题,需采取一系列措施来确保操作合法并避免浏览器阻止此行为。具体来说: 对于图像加载部分,应通过设置 `<img>` 标签的 `crossOrigin` 属性为 `"anonymous"` 或者 `"use-credentials"` 来请求带有适当 CORS 头部的信息[^1]。 ```html <img src="https://example.com/image.png" crossorigin="anonymous"> ``` 服务器端也需要配合客户端做出相应调整,即在响应头中加入必要的 CORS 配置项,允许来自特定名或所有名(*)对该资源发起带凭证的 GET 请求[^4]。 一旦确认图片来源已正确设置了 CORS 政策,则可以在 JavaScript 中利用 HTML5 提供的新特性——CORS-enabled images,在创建 Image 对象实例化之后立即指定其 crossOrigin 参数值[^2]。 ```javascript var img = new Image(); img.crossOrigin = 'Anonymous'; img.src = 'https://example.com/image.png'; ``` 如果上述方式仍无法解决问题,或者面对的是更复杂的场景比如 canvas 上绘制了多张不同源的图片,那么建议采用另一种思路:提前将这些外部链接转换成本地可用的数据 URI 方案 (data URL),也就是常说的 base64 编码字符串形式存储于内存之中;然后再把这些经过编码处理过的图形素材应用到 canvas 绘制流程当中去[^3]。 值得注意的是,尽管这种方法能够绕过同源策略限制,但由于它会增加页面体积以及可能带来性能上的开销,因此只应在必要情况下考虑使用。 #### 注意事项 - 确认目标网站确实启用了 CORS 并且愿意接受您的站点发出的站资源共享请求; - 如果涉及敏感信息传输,请谨慎评估是否适合开启 credentials 模式的访问权限; - 考虑到兼容性和效率因素,尽可能优先尝试直接修正服务端配置而非依赖 client-side workaround。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值