js本地预览图片、压缩图片、上传图片

预览图片,FileReader,可以读取File和Blob对象,并转为base64格式的图片

  <input type="file" id="input" accept="image/*" onchange="loadFiles(event)" />
  <br />
  <img alt="" style="width:300px;height: 300px;" id="img">
</body>
</html>
<script>
  const img = document.querySelector('#img');
  function file2DataUrl(file, callback) {
 var reader = new FileReader();
  reader.onload = function () {
    // 转换完成
    console.log(reader.result);
    // data:image/png;base64,iVBOR...R4XuxdB5g
    callback(reader.result);
  };
  // 转为base64字符串
  reader.readAsDataURL(file);
}

const loadFiles = (event) => {
  console.log(event);
  const file = event.target.files[0];
  file2DataUrl(file, (base64) => {
    img.src = base64
  })
}

预览图片,URL.createObjectURL,可以读取File和Blob对象,转为blob格式的字符串地址

  <input type="file" id="input" accept="image/*" onchange="loadFiles(event)" />
  <br />
  <img alt="" style="width:300px;height: 300px;" id="img">
  <div id="wrap"></div>
</body>

</html>

<script>
  const img = document.querySelector('#img');
  const div = document.querySelector('#wrap');

  function file2Image(file, callback) {
    var image = new Image();
    var URL = window.webkitURL || window.URL;
    if (URL) {
      // 'blob:http://127.0.0.1:5500/43...4-a96d0150edc0'
      var blobUrl = URL.createObjectURL(file);
      image.onload = function () {
        callback(image);
        URL.revokeObjectURL(blobUrl);
      };
      image.src = blobUrl;
    }
  }

  const loadFiles = (event) => {
    console.log(event);
    const file = event.target.files[0];
    file2Image(file, (image) => {
      div.append(image)
    })
  }

预览图片、压缩图片,file转canvas,canvas转base64,canvas转blob对象

  <input type="file" id="input" accept="image/*" onchange="loadFiles(event)" />
  <br />
  <img alt="" style="width:300px;height: 300px;" id="img">
  <div id="wrap"></div>
</body>

</html>

<script>
  const img = document.querySelector('#img');
  const div = document.querySelector('#wrap');

  function file2Image(file, callback) {
    var image = new Image();
    var URL = window.webkitURL || window.URL;
    if (URL) {
      var url = URL.createObjectURL(file);
      image.onload = function () {
        callback && callback(image);
        URL.revokeObjectURL(url);
      };
      image.src = url;
      return image;
    }
  }
  // 生成canvas元素
  function image2Canvas(image) {
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    canvas.width = image.naturalWidth;
    canvas.height = image.naturalHeight;
    console.log(canvas.width, canvas.height);
    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
    return canvas;
  }

  const loadFiles = (event, type, quality) => {
    const file = event.target.files[0];
    console.log(file);
    file2Image(file, (image) => {
      // 带有src的image实例
      console.log(image);
      div.append(image)
      const canvas = image2Canvas(image);
      div.append(canvas)
      console.log(canvas);
      // 通过控制quality的值(0-1)实现简易压缩,type通常为jpeg格式,因为png图片压缩会出现“压缩率不高”,“不减反增”,“黑屏现象”等问题
      const base64 = canvas.toDataURL(type || 'image/jpeg', quality || 0.8);
      console.log(base64);
      img.src = base64;
      // 转为blob对象,有size、type属性
      canvas.toBlob(function (blob) {
        console.log('blob', blob);
        // 也可转为blob url
        file2Image(blob);
      }, type || 'image/jpeg', quality || 0.8);
    })
  }

base64转blob

  // blob对象的size与file对象的size可以比较(同一张图片它们的size相等)
  function dataURLtoFile(base64) {
    let binary = atob(base64.split(",")[1]);
    let array = [];
    for (let i = 0; i < binary.length; i++) {
      array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {
      type: 'image/png'
    });
  }

base64转file

  function dataURLtoFiles(base64, filename) {
    var arr = base64.split(','),
      mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]),
      n = bstr.length,
      u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, {
      type: mime
    });
  }

blob转file

    let fileFormat = new File([blob], 'test.jpg', {
      type: blob.type
    })
    console.log("File对象", fileFormat);

file转blob

  // 同一个图片,dataUrlToBlob保存原有size值,fileToBlob则比原有size值大
  function fileToBlob(file) {
    let reader = new FileReader();
    reader.onload = (e) => {
      let base64 = e.target.result;
      let blob = new Blob([base64], {
        type: file.type
      });
      console.log("Blob对象", blob);
    }
    reader.readAsDataURL(file)
  }

  function dataUrlToBlob(base64, mimeType) {
    let bytes = window.atob(base64.split(",")[1]);
    let ab = new ArrayBuffer(bytes.length);
    let ia = new Uint8Array(ab);
    for (let i = 0; i < bytes.length; i++) {
      ia[i] = bytes.charCodeAt(i);
    }
    return new Blob([ab], {
      type: mimeType
    });
  }

上传图片

 // formData上传file对象
 var fd = new FormData();
 fd.append('file', file);
 // FileReader上传二进制数据
 var reader = new FileReader();
 xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
 reader.onload = function() {
    xhr.send(reader.result);
 };
 // reader.readAsDataURL(file);base64字符串
 reader.readAsBinaryString(file);二进制数据,已废弃
 // reader.readAsArrayBuffer(file);arrayBuffer
 // reader.readAsText(file);转为指定编码的字符串

压缩图片

  <input type="file" id="input" accept="image/*" onchange="loadFiles(event)" />
  // 生成image实例
  function file2Image(file, callback) {
    var image = new Image();
    var URL = window.webkitURL || window.URL;
    if (URL) {
      var url = URL.createObjectURL(file);
      console.log('blob url', url);
      image.onload = function () {
        callback(image);
        URL.revokeObjectURL(url);
      };
      image.src = url;
      return image;
    }
  }
  // 图片实例转为canvas
  function image2Canvas(image) {
    console.log('image', image);
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    canvas.width = image.naturalWidth;
    canvas.height = image.naturalHeight;
    console.log(canvas.width, canvas.height);
    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
    return canvas;
  }

  let n = 0;
  const loadFiles = (event) => {
    const file = event.target.files[0];
    console.log(file);
    console.log('file size', file.size / 1024 / 1024);

    const fn = (file) => {
      // 5M
      if (file.size <= 5242880) {
        // 压缩后的file和压缩次数
        console.log('n====',file, n);
        return file;
      }
      file2Image(file, (image, type, quality) => {
        console.log('实例', image);
        // div.append(image)
        const canvas = image2Canvas(image);
        // div.append(canvas)
        console.log('canvas', canvas);
        // const base64 = canvas.toDataURL(type || 'image/jpeg', quality || 0.1);
        // console.log('base64', base64);
        canvas.toBlob(function (blob) {
          // 压缩次数统计
          n++;
          console.log('blob---', blob);
          console.log('size', blob.size / 1024 / 1024);
          fn(blob);
        }, type || 'image/jpeg', 0.8);
        // console.log(base64);
        // img.src = base64;
      })
    }

    fn(file);
  }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容