js图片的几种转换

  • 图片地址转base64的两种方法
    1.使用canvas
    将图像绘制到大小同样的canvas上(大小不同转出来的会带有空白部分),然后使用canvas.toDataURL得到base64的字符串
/**
 * 将图片的url路径转为base64路径
 * 可以用await等待Promise的异步返回
 * @param {Object} imgUrl 图片路径
 */
export function getBase64Sync(imgUrl) {
  return new Promise(function (resolve, reject) {
    // 一定要设置为let,不然图片不显示
    let image = new Image();
    //图片地址
    image.src = imgUrl;
    // 解决跨域问题
    image.setAttribute("crossOrigin", "*"); // 支持跨域图片
    // image.onload为异步加载
    image.onload = function () {
      let canvas = document.createElement("canvas");
      canvas.width = image.width;
      canvas.height = image.height;
      let context = canvas.getContext("2d");
      context.drawImage(image, 0, 0, image.width, image.height);
      //图片后缀名
      let ext = image.src
        .substring(image.src.lastIndexOf(".") + 1)
        .toLowerCase();
      //图片质量
      let quality = 0.8;
      //转成base64
      let dataurl = canvas.toDataURL("image/" + ext, quality);
      //返回
      resolve(dataurl);
   
    // return dataurl
    };
  });
}

2.使用FileReader
适用于上传图片,然后将图片的base64发送给后端的情况

window.onload = function () {
            // 获取文件dom
            var input = document.getElementById("fielinput");
            // 判断该浏览器是否支持FileReader
            if (typeof (FileReader) === 'undefined') {
                console.log("你的浏览器不支持 FileReader");
                input.setAttribute('disabled', 'disabled');
            } else {
                // 为file添加事件监听
                input.addEventListener('change', parseFileToBase64, false);
            }
  		}
function fileReader2Base64(el) {
  const file = el.files[0];
  const reader = new FileReader();
  reader.onloadend = function () {
    console.log("FileReader:", reader.result);
  };
 
  // readAsDataURL 方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState 会变成已完成DONE
  // 并触发 loadend (en-US) 事件,同时 result 属性将包含一个data:URL 格式的字符串(base64 编码)以表示所读取文件的内容。
  reader.readAsDataURL(file);
}
  • base64图片地址转为二进制文件流
 /**
     * @description: 将base64图片地址转为二进制文件流
     * @param {*} dataurl    文件地址
     * @param {*} filename    文件名
     * @return {*}
     */
   export base64toFile(dataurl, filename = "file") {
      let arr = dataurl.split(",");
      let mime = arr[0].match(/:(.*?);/)[1];
      let suffix = mime.split("/")[1];
      let bstr = atob(arr[1]);
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      let file = new File([u8arr], `${filename}.${suffix}`, {
        type: mime,
      });
      const formData = new FormData();
      formData.append("file", file);
    },