image.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. export default class ImageCompress {
  2. constructor(file, fileSize, maxWH = 1920) {
  3. this.file = file
  4. this.fileSize = fileSize
  5. this.maxWH = maxWH // 最大长宽
  6. }
  7. compress() {
  8. // 压缩
  9. const fileType = this.file.type
  10. const fileSize = this.file.size / 1024
  11. return new Promise(resolve => {
  12. const reader = new FileReader();
  13. reader.readAsDataURL(this.file);
  14. reader.onload = () => {
  15. const canvas = document.createElement('canvas');
  16. const img = document.createElement('img');
  17. img.src = reader.result;
  18. img.onload = () => {
  19. const ctx = canvas.getContext('2d');
  20. let _dWH = this.dWH(img.width, img.height, this.maxWH)
  21. canvas.width = _dWH.width
  22. canvas.height = _dWH.height
  23. // 清空后, 重写画布
  24. ctx.clearRect(0, 0, canvas.width, canvas.height)
  25. ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
  26. let newImgData = canvas.toDataURL(fileType, 0.90)
  27. // 压缩宽高后的图像大小
  28. let newImgSize = this.fileSizeKB(newImgData)
  29. if (newImgSize > this.fileSize) {
  30. console.log('图片尺寸太大!' + fileSize + " >> " + newImgSize)
  31. reject(`图片尺寸太大!`)
  32. }
  33. let blob = this.dataURLtoBlob(newImgData, fileType)
  34. let nfile = new File([blob], this.file.name);
  35. resolve(nfile)
  36. };
  37. };
  38. });
  39. }
  40. /*
  41. * 长宽等比缩小
  42. * 图像的一边(长或宽)为最大目标值
  43. * */
  44. dWH(srcW, srcH, dMax) {
  45. let defaults = {
  46. width: srcW,
  47. height: srcH
  48. }
  49. if (Math.max(srcW, srcH) > dMax) {
  50. if (srcW > srcH) {
  51. defaults.width = dMax
  52. defaults.height = Math.round(srcH * (dMax / srcW))
  53. return defaults
  54. } else {
  55. defaults.height = dMax
  56. defaults.width = Math.round(srcW * (dMax / srcH))
  57. return defaults
  58. }
  59. } else {
  60. return defaults
  61. }
  62. }
  63. fileSizeKB(dataURL) {
  64. let self = this
  65. let sizeKB = 0
  66. sizeKB = Math.round((dataURL.split(',')[1].length * 3 / 4) / 1024)
  67. return sizeKB
  68. }
  69. /*
  70. * 转为Blob
  71. * */
  72. dataURLtoBlob(dataURL, fileType) {
  73. let self = this
  74. let byteString = atob(dataURL.split(',')[1])
  75. let mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0]
  76. let ab = new ArrayBuffer(byteString.length)
  77. let ia = new Uint8Array(ab)
  78. for (let i = 0; i < byteString.length; i++) {
  79. ia[i] = byteString.charCodeAt(i)
  80. }
  81. if (fileType) {
  82. mimeString = fileType
  83. }
  84. return new Blob([ab], { type: mimeString, lastModifiedDate: new Date() })
  85. }
  86. }