1
0

compressUtil.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /**
  2. * 图片压缩类
  3. * @param minSize
  4. * @param maxSize
  5. * @constructor
  6. */
  7. var PhotoCompress = function (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) {
  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. fileName=fileName+'.jpg';
  27. console.log(fileName)
  28. return new File([u8arr], fileName, {type: mime});
  29. }
  30. /**
  31. * 图片压缩
  32. * @param file 文件
  33. * @param callback 回调函数
  34. */
  35. PhotoCompress.prototype.compress = function (file, callback) {
  36. var self = this;
  37. self.imgBase64(file, function (image, canvas) {
  38. var base64Codes = canvas.toDataURL('image/jpeg', nextQ); // y压缩
  39. var compressFile = self.dataUrlToFile(base64Codes, file.name.split('.')[0]); // 转成file文件
  40. var compressFileSize = compressFile.size; // 压缩后文件大小 k
  41. console.log("图片质量:" + nextQ);
  42. console.log("压缩后文件大小:" + compressFileSize / 1024);
  43. if (compressFileSize > maxSize) { // 压缩后文件大于最大值
  44. maxQ = nextQ;
  45. nextQ = nextQ-0.1; // 质量降低
  46. self.compress(file, callback);
  47. }
  48. // else if (compressFileSize < minSize) { // 压缩以后文件小于最小值
  49. // minQ = nextQ;
  50. // nextQ = (nextQ + maxQ) / 2; // 质量提高
  51. // self.compress(file, callback);
  52. // }
  53. else {
  54. callback(compressFile);
  55. }
  56. });
  57. }
  58. /**
  59. * 将图片转化为base64
  60. * @param file 文件
  61. * @param callback 回调函数
  62. */
  63. PhotoCompress.prototype.imgBase64 = function (file, callback) {
  64. // 看支持不支持FileReader
  65. if (!file || !window.FileReader) return;
  66. var image = new Image();
  67. // 绑定 load 事件处理器,加载完成后执行
  68. image.onload = function () {
  69. var canvas = document.createElement('canvas')
  70. var ctx = canvas.getContext('2d')
  71. ctx.clearRect(0, 0, canvas.width, canvas.height);
  72. let width=700;
  73. canvas.width = 700;
  74. canvas.height = image.height*700/image.width;
  75. ctx.clearRect(0, 0, canvas.width, canvas.height)
  76. ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
  77. // let type = file.type !== "image/jpeg" || file.type !== "image/png";
  78. // ctx.toBlob(function (blob) {
  79. // const f = new File([blob], file.name, {
  80. // type,
  81. // lastModified: file.lastModified
  82. // })
  83. // resolve(f)
  84. // }, type)
  85. callback(image, canvas);
  86. };
  87. if (/^image/.test(file.type)) {
  88. // 创建一个reader
  89. var reader = new FileReader();
  90. // 将图片将转成 base64 格式
  91. reader.readAsDataURL(file);
  92. // 读取成功后的回调
  93. reader.onload = function () {
  94. // self.imgUrls.push(this.result);
  95. // 设置src属性,浏览器会自动加载。
  96. // 记住必须先绑定事件,才能设置src属性,否则会出同步问题。
  97. image.src = this.result;
  98. }
  99. }
  100. }
  101. };