uniImgUtils.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /**
  2. * @description 图片处理方法
  3. * */
  4. export default {
  5. /**
  6. * @description 获取图片信息
  7. * @param {string} src 地址
  8. * @return {number}
  9. * */
  10. getImageInfo(src) {
  11. return new Promise((resolve, reject) => {
  12. if (!src) {
  13. reject('图片地址不能为空!');
  14. }
  15. uni.getImageInfo({
  16. src,
  17. success(res) {
  18. // #ifdef MP-ALIPAY
  19. res.errMsg = 'getImageInfo:ok';//支付宝小程序直接 返回图片信息 没有 ‘getImageInfo:ok’
  20. // #endif
  21. if (res.errMsg === 'getImageInfo:ok') {
  22. resolve(res);
  23. } else {
  24. reject('获取图片信息失败!');
  25. }
  26. },
  27. fail(err) {
  28. reject('调取获取图片接口失败!');
  29. }
  30. });
  31. });
  32. },
  33. /*选取图片*/
  34. chooseImage({count = 9, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera']}
  35. = {count: 9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera']}) {
  36. return new Promise((resolve, reject) => {
  37. uni.chooseImage({
  38. count,
  39. sizeType,
  40. sourceType,
  41. success(res) {
  42. console.log(res)
  43. if (res.errMsg === 'chooseImage:ok') {
  44. resolve(res.tempFilePaths);
  45. } else {
  46. reject('选取图片失败');
  47. }
  48. },
  49. fail(err) {
  50. console.log('error',err)
  51. reject('取消选取图片');
  52. }
  53. });
  54. });
  55. },
  56. /*图片预览
  57. * path 图片下标 或路径
  58. * imgs 图片集合
  59. * */
  60. previewImage(path, imgs) {
  61. uni.previewImage({
  62. current: path,
  63. urls: imgs
  64. });
  65. },
  66. /*压缩图片*/
  67. /*图片转base64*/
  68. /*图片转本地临时路径blob*/
  69. img2blob() {
  70. }
  71. /*图片截取*/
  72. /*图片转base64*/
  73. , img2base64(path) {
  74. return new Promise(((resolve, reject) => {
  75. if (path.includes(';base64,')) {
  76. resolve(path)
  77. return;
  78. }
  79. // #ifdef H5
  80. window.URL = window.URL || window.webkitURL;
  81. var xhr = new XMLHttpRequest();
  82. xhr.open("get", path, true);
  83. // 至关重要
  84. xhr.responseType = "blob";
  85. xhr.onload = function () {
  86. if (this.status == 200) {
  87. //得到一个blob对象
  88. var blob = this.response;
  89. console.log("blob", blob)
  90. // 至关重要
  91. let oFileReader = new FileReader();
  92. oFileReader.onloadend = function (e) {
  93. let base64 = e.target.result;
  94. resolve(base64)
  95. };
  96. oFileReader.readAsDataURL(blob);
  97. }
  98. }
  99. xhr.send();
  100. // #endif
  101. // #ifdef MP-WEIXIN
  102. uni.getFileSystemManager().readFile({
  103. filePath: path,
  104. encoding: 'base64',
  105. success: function (data) {
  106. let path = 'data:image/jpeg;base64,' + data.data;
  107. resolve(path)
  108. },
  109. fail() {
  110. reject('图片转base64失败')
  111. }
  112. });
  113. // #endif
  114. // #ifdef APP-PLUS
  115. plus.io.resolveLocalFileSystemURL(path, (entry) =>{
  116. entry.file( (e)=> {
  117. let fileReader = new plus.io.FileReader();
  118. fileReader.onload = function(r){
  119. resolve(r.target.result)
  120. }
  121. fileReader.readAsDataURL(e)
  122. })
  123. })
  124. // #endif
  125. }))
  126. },
  127. /**
  128. * @description 缩放图片
  129. * @param img_size {number} 原图大小
  130. * @param img_width {number} 原图宽度
  131. * @param img_height {number} 原图高度
  132. * @param img_zoom_size {number} 缩放后的图大小 kb
  133. * @param max_width_or_height {number} 缩放后的最大高
  134. * @return re {object} 返回图片的尺寸信息
  135. * */
  136. imgZoom({img_size, img_width, img_height, img_zoom_size, max_width_or_height}) {
  137. let re = {width: img_width, height: img_height};
  138. if (img_zoom_size) {
  139. /*如果需要压缩的大小大于原大小则不处理*/
  140. if (img_zoom_size >= img_size) {
  141. return re;
  142. }
  143. /*压缩倍数*/
  144. let beis = img_size / img_zoom_size;
  145. /*根据压缩设置压缩宽高*/
  146. re.width = Math.ceil(img_width / beis);
  147. re.height = Math.ceil(img_height / beis);
  148. } else if (max_width_or_height) {
  149. let max_size = Math.max(img_width, img_height);
  150. if (max_width_or_height >= max_size) {
  151. return re;
  152. }
  153. /*压缩倍数*/
  154. let beis = max_size / max_width_or_height;
  155. re.width = Math.ceil(img_width / beis);
  156. re.height = Math.ceil(img_height / beis);
  157. }
  158. return re;
  159. },
  160. base642Blob(dataURI) {
  161. var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // mime类型
  162. var byteString = atob(dataURI.split(',')[1]); //base64 解码
  163. var arrayBuffer = new ArrayBuffer(byteString.length); //创建缓冲数组
  164. var intArray = new Uint8Array(arrayBuffer); //创建视图
  165. for (var i = 0; i < byteString.length; i++) {
  166. intArray[i] = byteString.charCodeAt(i);
  167. }
  168. return new Blob([intArray], {type: mimeString});
  169. },
  170. /*压缩图片指定大小*/
  171. compressImg(url, canvas_id, width = 100, height = 100, self) {
  172. return new Promise((resolve, reject) => {
  173. /*加上延迟 处理h5 防止为改变dome 大小就开始绘制 会出现图片显示不完整*/
  174. setTimeout(()=>{
  175. const ctx = uni.createCanvasContext(canvas_id, self);
  176. console.log(ctx, url, canvas_id, width, height, self)
  177. ctx.setFillStyle('#fff')
  178. ctx.fillRect(0, 0, width, height)
  179. ctx.drawImage(url, 0, 0, width, height );
  180. ctx.draw(false, () => {
  181. setTimeout(() => {
  182. uni.canvasToTempFilePath({
  183. x:0,
  184. y:0,
  185. canvasId: canvas_id,
  186. width: width,
  187. height: height,
  188. destWidth: width,
  189. destHeight: height,
  190. success: (res) => {
  191. // #ifdef H5
  192. // document.querySelector('canvas').toBlob( (fileSrc)=> {
  193. // console.log(888,fileSrc)
  194. // let imgSrc = window.URL.createObjectURL(fileSrc)
  195. // resolve(imgSrc)
  196. //
  197. // })
  198. resolve(res.tempFilePath)
  199. // resolve(URL.createObjectURL(this.base642Blob(res.tempFilePath)))
  200. // #endif
  201. // #ifndef H5
  202. resolve(res.tempFilePath)
  203. // #endif
  204. },
  205. fail: (err) => {
  206. console.log(err)
  207. }
  208. }, self)
  209. }, 500)
  210. })
  211. },500)
  212. })
  213. }
  214. };