image.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /**
  2. * APP端图片压缩
  3. * 参数说明:
  4. * img 图片url
  5. * scale缩放比例 1-100
  6. * callback 回调设置返回值
  7. */
  8. export function translateapp(img, scale, callback) {
  9. plus.io.resolveLocalFileSystemURL(img, (entry) => { //通过URL参数获取目录对象或文件对象
  10. entry.file((file) => { // 可通过entry对象操作图片
  11. if (file.size > 504800) { // 如果大于500Kb进行压缩
  12. plus.zip.compressImage({ // 5+ plus.zip.compressImage 了解一下,有详细的示例
  13. src: img, //src: 压缩原始图片的路径
  14. dst: img.replace('.png', 'yasuo.png').replace('.PNG',
  15. 'yasuo.PNG').replace('.jpg', 'yasuo.jpg')
  16. .replace('.JPG', 'yasuo.JPG'),
  17. width: '40%', //dst: (String 类型 )压缩转换目标图片的路径,这里先在后面原始名后面加一个yasuo区分一下
  18. height: '40%', //width,height: (String 类型 )缩放图片的宽度,高度
  19. quality: scale, //quality: (Number 类型 )压缩图片的质量
  20. overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件
  21. // format:'jpg' //format: (String 类型 )压缩转换后的图片格式
  22. }, (event) => {
  23. //返回压缩后的图片路径
  24. callback(event.target);
  25. }, function(err) {
  26. console.log('Resolve file URL failed: ' + err.message);
  27. });
  28. } else { //else小于500kb跳过压缩,直接返回现有的src
  29. callback(img);
  30. }
  31. });
  32. }, (e) => { // 返回错误信息
  33. console.log('Resolve file URL failed: ' + e.message);
  34. });
  35. }
  36. /**
  37. * H5端图片压缩
  38. * 参数说明:
  39. * imgSrc 图片url
  40. * scale缩放比例 0-1
  41. * type 返回图片类型 默认blob
  42. * callback 回调设置返回值
  43. */
  44. export function translate(imgSrc, scale, type, callback) {
  45. var img = new Image();
  46. img.src = imgSrc;
  47. img.onload = function() {
  48. var that = this;
  49. let yasuobi = 700 / that.width
  50. let h = that.height * yasuobi;
  51. let w = that.width * yasuobi;
  52. var canvas = document.createElement('canvas');
  53. var ctx = canvas.getContext('2d');
  54. var width = document.createAttribute("width");
  55. width.nodeValue = w;
  56. var height = document.createAttribute("height");
  57. height.nodeValue = h;
  58. canvas.setAttributeNode(width);
  59. canvas.setAttributeNode(height);
  60. ctx.drawImage(that, 0, 0, w, h);
  61. var base64 = canvas.toDataURL('image/jpeg', scale); //压缩比例
  62. canvas = null;
  63. if (type == 'base64') {
  64. var blob = base64ToBlob(base64);
  65. var blobUrl = window.URL.createObjectURL(blob); //blob地址
  66. callback(base64, blobUrl);
  67. } else {
  68. var blob = base64ToBlob(base64);
  69. var blobUrl = window.URL.createObjectURL(blob); //blob地址
  70. callback(base64, blobUrl);
  71. }
  72. }
  73. }
  74. export function translateAll(imgSrc, callback) {
  75. translate1(imgSrc, 0.3, 'blob', callback)
  76. }
  77. export function translate1(imgSrc, scale, type, callback) {
  78. var img = new Image();
  79. img.src = imgSrc;
  80. img.onload = function() {
  81. var that = this;
  82. let yasuobi = 700 / that.width
  83. let h = that.height * yasuobi;
  84. let w = that.width * yasuobi;
  85. var canvas = document.createElement('canvas');
  86. var ctx = canvas.getContext('2d');
  87. var width = document.createAttribute("width");
  88. width.nodeValue = w;
  89. var height = document.createAttribute("height");
  90. height.nodeValue = h;
  91. canvas.setAttributeNode(width);
  92. canvas.setAttributeNode(height);
  93. ctx.drawImage(that, 0, 0, w, h);
  94. var base64 = canvas.toDataURL('image/jpeg', scale); //压缩比例
  95. canvas = null;
  96. if (type == 'base64') {
  97. var blob = base64ToBlob(base64);
  98. var blobUrl = window.URL.createObjectURL(blob); //blob地址
  99. // callback(base64, blobUrl, callback1);
  100. uni.getFileInfo({
  101. filePath: blobUrl,
  102. success: (res) => {
  103. let size = res.size
  104. let scale = 1
  105. if (size / 1024 / 1024 > 0.1) {
  106. scale = 0.6
  107. translate1(blobUrl, scale, 'blob', callback)
  108. } else {
  109. callback(base64, blobUrl)
  110. }
  111. },
  112. fail: (err) => {
  113. console.log(err);
  114. }
  115. })
  116. } else {
  117. var blob = base64ToBlob(base64);
  118. var blobUrl = window.URL.createObjectURL(blob); //blob地址
  119. // callback(base64, blobUrl, callback1);
  120. uni.getFileInfo({
  121. filePath: blobUrl,
  122. success: (res) => {
  123. let size = res.size
  124. let scale = 1
  125. // alert("blob上传文件的大小:"+(size / 1024 / 1024))
  126. if (size / 1024 / 1024 > 0.1) {
  127. scale = 0.6
  128. translate1(blobUrl, scale, 'blob', callback)
  129. } else {
  130. callback(base64, blobUrl)
  131. }
  132. },
  133. fail: (err) => {
  134. console.log("err:", err);
  135. }
  136. })
  137. }
  138. }
  139. }
  140. // base转Blob
  141. export function base64ToBlob(base64) {
  142. var arr = base64.split(','),
  143. mime = arr[0].match(/:(.*?);/)[1],
  144. bstr = atob(arr[1]),
  145. n = bstr.length,
  146. u8arr = new Uint8Array(n);
  147. while (n--) {
  148. u8arr[n] = bstr.charCodeAt(n);
  149. }
  150. return new Blob([u8arr], {
  151. type: mime
  152. });
  153. }
  154. // base转url
  155. export function base64ToUrl(base64) {
  156. var arr = base64.split(',')
  157. let blob = {}
  158. if (arr.length < 2) {
  159. const arrayBuffer = uni.base64ToArrayBuffer(base64);
  160. // 创建Blob对象
  161. blob = new Blob([arrayBuffer], {
  162. type: 'image/jpg'
  163. });
  164. } else {
  165. var mime = arr[0].match(/:(.*?);/)[1]
  166. var bstr = atob(arr[1])
  167. var n = bstr.length
  168. var u8arr = new Uint8Array(n);
  169. while (n--) {
  170. u8arr[n] = bstr.charCodeAt(n);
  171. }
  172. blob = new Blob([u8arr], {
  173. type: mime
  174. });
  175. }
  176. return URL.createObjectURL(blob);
  177. }
  178. // blob 转 base64
  179. export function blobToDataURI(blob, callback) {
  180. var reader = new FileReader();
  181. reader.readAsDataURL(blob);
  182. reader.onload = function(e) {
  183. callback(e.target.result);
  184. };
  185. }
  186. // base64转File
  187. export function base64toFilen(dataurl, filename = 'file') {
  188. let arr = dataurl.split(',')
  189. let mime = arr[0].match(/:(.*?);/)[1]
  190. let suffix = mime.split('/')[1]
  191. let bstr = atob(arr[1])
  192. let n = bstr.length
  193. let u8arr = new Uint8Array(n)
  194. while (n--) {
  195. u8arr[n] = bstr.charCodeAt(n)
  196. }
  197. return new File([u8arr], `${filename}.${suffix}`, {
  198. type: mime
  199. })
  200. }
  201. // File转blob
  202. export function fileToBlob(file, callback) {
  203. var reader = new FileReader();
  204. // 当文件读取完毕后,reader.result就会包含文件的内容
  205. reader.onload = function(event) {
  206. // 在这里,event.target.result就是文件的blob形式
  207. var blob = new Blob([event.target.result], {
  208. type: file.type
  209. });
  210. // 接下来,你可以使用这个blob对象了,例如用它来创建一个URL
  211. var blobURL = URL.createObjectURL(blob);
  212. callback(blobURL)
  213. };
  214. // 以数据URL的形式读取文件
  215. reader.readAsArrayBuffer(file);
  216. }