compressImg.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /**
  2. * @压缩公共方法
  3. * @params file
  4. * @return 压缩后的文件,支持两种,file和 blob
  5. */
  6. export default function compressImg(file) {
  7. return new Promise((resolve, reject) => {
  8. const reader = new FileReader();
  9. // readAsDataURL 方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState 会变成已完成DONE,并触发 loadend (en-US) 事件,
  10. // 同时 result 属性将包含一个data:URL格式的字符串(base64编码)以表示所读取文件的内容。
  11. reader.readAsDataURL(file);
  12. reader.onload = () => {
  13. const img = new Image();
  14. img.src = reader.result;
  15. img.onload = () => {
  16. // 图片的宽高
  17. const w = img.width;
  18. const h = img.height;
  19. const canvas = document.createElement('canvas');
  20. // canvas对图片进行裁剪,这里设置为图片的原始尺寸
  21. canvas.width = w;
  22. canvas.height = h;
  23. const ctx = canvas.getContext('2d');
  24. // canvas中,png转jpg会变黑底,所以先给canvas铺一张白底
  25. ctx.fillStyle = '#fff';
  26. // fillRect()方法绘制一个填充了内容的矩形,这个矩形的开始点(左上点)在
  27. // (x, y) ,它的宽度和高度分别由width 和 height 确定,填充样式由当前的fillStyle 决定。
  28. ctx.fillRect(0, 0, canvas.width, canvas.height);
  29. // 绘制图像
  30. ctx.drawImage(img, 0, 0, w, h);
  31. // canvas转图片达到图片压缩效果
  32. // 返回一个包含图片展示的 data URI base64 在指定图片格式为 image/jpeg 或 image/webp的情况下,
  33. // 可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。
  34. const dataUrl = canvas.toDataURL('image/jpeg', 0.8);
  35. let newFile = dataURLtoFile(dataUrl, file.name);
  36. resolve(newFile);
  37. };
  38. };
  39. });
  40. }
  41. // base64->file
  42. function dataURLtoFile(dataurl, fileName) {
  43. let arr = dataurl.split(','),
  44. mime = arr[0].match(/:(.*?);/)[1],
  45. bstr = atob(arr[1]),
  46. n = bstr.length,
  47. u8arr = new Uint8Array(n);
  48. while (n--) {
  49. u8arr[n] = bstr.charCodeAt(n);
  50. }
  51. return new File([u8arr], fileName, {type: mime});
  52. }
  53. // base64->blob
  54. function dataURLtoBlob(dataurl) {
  55. const arr = dataurl.split(','),
  56. mime = arr[0].match(/:(.*?);/)[1],
  57. bstr = atob(arr[1]);
  58. let n = bstr.length;
  59. const u8arr = new Uint8Array(n);
  60. while (n--) {
  61. u8arr[n] = bstr.charCodeAt(n);
  62. }
  63. return new Blob([u8arr], {type: mime});
  64. }