123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- const calcImageSize = (res, pixels) => {
- let imgW, imgH
- imgW = res.width
- imgH = res.height
-
- let ratio
- if((ratio = imgW * imgH / pixels) > 1) {
- ratio = Math.sqrt(ratio)
- imgW = parseInt(imgW / ratio)
- imgH = parseInt(imgH / ratio)
- } else {
- ratio = 1
- }
-
- return { imgW, imgH }
- }
- const urlTobase64 = (url, type) => {
- return new Promise((resolve, reject) => {
- uni.getFileSystemManager().readFile({
- filePath: url,
- encoding: 'base64',
- success: res => {
- let base64 = res.data
- base64 = `data:image/${type};base64,${base64}`
- resolve(base64)
- }
- })
- })
- }
- const compress = (imgUrl, slef, options={}) => {
-
- const MAX_PIXELS = 2000000
- const MAX_QUALITY = 0.8
- const IMG_TYPE = 'jpg'
- const CANVAS_ID = 'compress_canvas'
- const BASE_64 = false
-
- return new Promise((resolve, reject) => {
- uni.getImageInfo({
- src: imgUrl,
- success: res => {
- let pixels = options.pixels || MAX_PIXELS
- let quality = options.quality || MAX_QUALITY
- let type = options.type || IMG_TYPE
- let canvasId = options.canvasId || CANVAS_ID
- let isBase64 = options.base64 || BASE_64
-
- let { imgW, imgH } = calcImageSize(res, pixels)
- let w = options.width || imgW
- let h = options.height || imgH
-
- type = type == 'jpg' ? 'jpeg' : type,
-
-
-
- type = type == 'png' ? 'png' : 'jpg',
-
- console.log(`%c 宽: ${w} %c 高: ${h} %c 分辨率: ${w * h} %c 质量: ${quality} %c 类型: ${type}`, 'color:#f00', 'background-color:#f60;color:#fff', 'color:#F00', 'background-color:#f60;color:#fff', 'color:#F00')
-
-
- let img = new Image()
- img.src = res.path
- img.onload = () => {
- const canvas = document.createElement('canvas')
- const ctx = canvas.getContext('2d')
- canvas.width = w
- canvas.height = h
- let drawW = w, drawH = h
-
- ctx.drawImage(img, 0, 0, drawW, drawH)
-
- let base64 = canvas.toDataURL(`image/${type}`, quality)
-
- resolve(base64)
- }
-
-
-
-
-
- slef.height = h
- slef.width = w
-
- slef.$nextTick(function() {
- let canvas = null
- if(!canvas) {
- canvas = uni.createCanvasContext(canvasId, slef)
- }
- canvas.drawImage(res.path, 0, 0, w, h)
- canvas.draw()
- setTimeout(() => {
- uni.canvasToTempFilePath({
- canvasId: canvasId,
- x: 0,
- y: 0,
- width: w,
- height: h,
- destWidth: w,
- destHeight: h,
- fileType: type,
- quality: quality,
- success: file => {
- if(isBase64) {
- urlTobase64(file.tempFilePath, type)
- .then(res => {
- canvas = null
- resolve(res)
- })
- .catch(e => {
- reject({
- code: -4,
- msg: '图片转base64错误',
- data: e
- })
- })
- } else {
- resolve(file.tempFilePath)
- }
- },
- fail: e => {
- reject({
- code: -3,
- msg: 'canvas转图片错误',
- data: e
- })
- }
- }, slef)
- }, 500)
- })
-
- }
- })
- })
- }
- export default compress
|