compressUtil.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * 图片压缩类
  3. * @param minSize
  4. * @param maxSize
  5. * @constructor
  6. */
  7. export function PhotoCompress(minSize, maxSize) {
  8. var nextQ = 0.5; // 压缩比例
  9. var maxQ = 1;
  10. var minQ = 0;
  11. /**
  12. * 将base64转换为文件
  13. * @param base64Codes base64编码
  14. * @param fileName 文件名称
  15. * @returns {*}
  16. */
  17. PhotoCompress.prototype.dataUrlToFile = function (base64Codes, fileName = new Date().getTime()) {
  18. var arr = base64Codes.split(','),
  19. mime = arr[0].match(/:(.*?);/)[1],
  20. bStr = atob(arr[1]),
  21. n = bStr.length,
  22. u8arr = new Uint8Array(n);
  23. while (n--) {
  24. u8arr[n] = bStr.charCodeAt(n);
  25. }
  26. return new File([u8arr], fileName, { type: mime });
  27. }
  28. /**
  29. * 图片压缩
  30. * @param file 文件
  31. * @param callback 回调函数
  32. */
  33. PhotoCompress.prototype.compress = function (file, callback) {
  34. var self = this;
  35. self.imgBase64(file, function (image, canvas) {
  36. var base64Codes = canvas.toDataURL(file.type, nextQ); // y压缩
  37. var compressFile = self.dataUrlToFile(base64Codes, file.name.split('.')[0]); // 转成file文件
  38. var compressFileSize = compressFile.size; // 压缩后文件大小 k
  39. console.log("图片质量:" + nextQ);
  40. console.log("压缩后文件大小:" + compressFileSize / 1024);
  41. if (compressFileSize > maxSize) { // 压缩后文件大于最大值
  42. maxQ = nextQ;
  43. nextQ = (nextQ + minQ) / 2; // 质量降低
  44. self.compress(file, callback);
  45. } else if (compressFileSize < minSize) { // 压缩以后文件小于最小值
  46. minQ = nextQ;
  47. nextQ = (nextQ + maxQ) / 2; // 质量提高
  48. self.compress(file, callback);
  49. } else {
  50. callback(compressFile);
  51. }
  52. });
  53. }
  54. /**
  55. * 将图片转化为base64
  56. * @param file 文件
  57. * @param callback 回调函数
  58. */
  59. PhotoCompress.prototype.imgBase64 = function (file, callback) {
  60. // 看支持不支持FileReader
  61. if (!file || !window.FileReader) return;
  62. var image = new Image();
  63. // 绑定 load 事件处理器,加载完成后执行
  64. image.onload = function () {
  65. var canvas = document.createElement('canvas')
  66. var ctx = canvas.getContext('2d')
  67. ctx.clearRect(0, 0, canvas.width, canvas.height);
  68. canvas.width = image.width * nextQ;
  69. canvas.height = image.height * nextQ;
  70. ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
  71. callback(image, canvas);
  72. };
  73. if (/^image/.test(file.type)) {
  74. // 创建一个reader
  75. var reader = new FileReader();
  76. // 将图片将转成 base64 格式
  77. reader.readAsDataURL(file);
  78. // 读取成功后的回调
  79. reader.onload = function () {
  80. // self.imgUrls.push(this.result);
  81. // 设置src属性,浏览器会自动加载。
  82. // 记住必须先绑定事件,才能设置src属性,否则会出同步问题。
  83. image.src = this.result;
  84. }
  85. }
  86. }
  87. };