reseize.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * 追加对象存储自动裁剪/压缩参数
  3. *
  4. * @return string
  5. */
  6. export function append_thumbnail_params(url, params) {
  7. const filesystem = $store('app').info.filesystem;
  8. if (filesystem === 'public') {
  9. return url;
  10. }
  11. let width = params.width || '200'; // 宽度
  12. let height = params.height || '200'; // 高度
  13. let mode = params.mode || 'lfit'; // 缩放模式
  14. let quality = params.quality || 90; // 压缩质量
  15. let gravity = params.gravity || 'center'; // 剪裁质量
  16. let suffix = '';
  17. let crop_str = '';
  18. let quality_str = '';
  19. let size = width + 'x' + height;
  20. switch (filesystem) {
  21. case 'aliyun':
  22. // 裁剪
  23. if (!gravity && gravity != 'center') {
  24. // 指定了裁剪区域
  25. mode = 'mfit';
  26. crop_str = '/crop,g_' + gravityFormat('aliyun', gravity) + ',w_' + width + ',h_' + height;
  27. }
  28. // 质量压缩
  29. if (quality > 0 && quality < 100) {
  30. quality_str = '/quality,q_' + quality;
  31. }
  32. // 缩放参数
  33. suffix = 'x-oss-process=image/resize,m_' + mode + ',w_' + width + ',h_' + height;
  34. // 拼接裁剪和质量压缩
  35. suffix += crop_str + quality_str;
  36. break;
  37. case 'qcloud':
  38. let mode_str = 'thumbnail';
  39. if (mode == 'fill' || (!gravity && gravity != 'center')) {
  40. // 指定了裁剪区域
  41. mode_str = 'crop';
  42. mode = 'fill';
  43. crop_str = '/gravity/' + gravityFormat('qcloud', gravity);
  44. }
  45. // 质量压缩
  46. if (quality > 0 && quality < 100) {
  47. quality_str = '/rquality/' + quality;
  48. }
  49. switch (mode) {
  50. case 'lfit':
  51. size = '' + size + '>';
  52. break;
  53. case 'mfit':
  54. size = '!' + size + 'r';
  55. case 'fill':
  56. break;
  57. case 'pad':
  58. size = size + '/pad/1';
  59. break;
  60. case 'fixed':
  61. size = size + '!';
  62. break;
  63. }
  64. suffix = 'imageMogr2/' + mode_str + '/' + size + crop_str + quality_str;
  65. break;
  66. case 'qiniu':
  67. if (mode == 'fill' || (!gravity && gravity != 'center')) {
  68. // 指定了裁剪区域,全部转为 mfit
  69. mode = 'mfit';
  70. crop_str = '/gravity/' + gravityFormat('qiniu', gravity) + '/crop/' + size;
  71. }
  72. // 质量压缩
  73. if (quality > 0 && quality < 100) {
  74. quality_str = '/quality/' + quality;
  75. }
  76. switch (mode) {
  77. case 'lfit':
  78. case 'pad': // 七牛不支持在缩放之后,尺寸不足时,填充背景色,所以这里和 lfit 模式一样
  79. size = size + '>';
  80. break;
  81. case 'mfit':
  82. size = '!' + size + 'r';
  83. break;
  84. case 'fill':
  85. // 会被转为 mfit
  86. break;
  87. case 'fixed':
  88. size = size + '!';
  89. break;
  90. }
  91. suffix = 'imageMogr2/thumbnail/' + size + crop_str + quality_str;
  92. break;
  93. }
  94. return url + '?' + suffix;
  95. }
  96. /**
  97. * 裁剪区域格式转换
  98. *
  99. * @param string $type aliyun|qcloud|qiniu
  100. * @param string $gravity 统一的裁剪区域字符
  101. *
  102. * @return string
  103. */
  104. export function gravityFormatMap(type, gravity) {
  105. let gravityFormat = {
  106. aliyun: {
  107. north_west: 'nw', // 左上
  108. north: 'north', // 中上
  109. north_east: 'ne', // 右上
  110. west: 'west', // 左中
  111. center: 'center', // 中部
  112. east: 'east', // 右中
  113. south_west: 'sw', // 左下
  114. south: 'south', // 中下
  115. south_east: 'se', // 右下
  116. },
  117. qcloud: {
  118. northwest: 'nw', // 左上
  119. north: 'north', // 中上
  120. northeast: 'ne', // 右上
  121. west: 'west', // 左中
  122. center: 'center', // 中部
  123. east: 'east', // 右中
  124. southwest: 'sw', // 左下
  125. south: 'south', // 中下
  126. southeast: 'se', // 右下
  127. },
  128. qiniu: {
  129. NorthWest: 'nw', // 左上
  130. North: 'north', // 中上
  131. NorthEast: 'ne', // 右上
  132. West: 'west', // 左中
  133. Center: 'center', // 中部
  134. East: 'east', // 右中
  135. SouthWest: 'sw', // 左下
  136. South: 'south', // 中下
  137. SouthEast: 'se', // 右下
  138. },
  139. };
  140. return gravityFormat[type][gravity];
  141. }