|
|
export const networkReg = /^(http|\/\/)/;export const isBase64 = (path) => /^data:image\/(\w+);base64/.test(path);export function sleep(delay) { return new Promise(resolve => setTimeout(resolve, delay))}let {platform, SDKVersion} = uni.getSystemInfoSync() export const isPC = /windows|mac/.test(platform)// 缓存图片
let cache = {}export function isNumber(value) { return /^-?\d+(\.\d+)?$/.test(value);}export function toPx(value, baseSize, isDecimal = false) { // 如果是数字
if (typeof value === 'number') { return value } // 如果是字符串数字
if (isNumber(value)) { return value * 1 } // 如果有单位
if (typeof value === 'string') { const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g const results = reg.exec(value); if (!value || !results) { return 0; } const unit = results[3]; value = parseFloat(value); let res = 0; if (unit === 'rpx') { res = uni.upx2px(value); } else if (unit === 'px') { res = value * 1; } else if (unit === '%') { res = value * toPx(baseSize) / 100; } else if (unit === 'em') { res = value * toPx(baseSize || 14); } return isDecimal ? res.toFixed(2) * 1 : Math.round(res); } return 0}
// 计算版本
export function compareVersion(v1, v2) { v1 = v1.split('.') v2 = v2.split('.') const len = Math.max(v1.length, v2.length) while (v1.length < len) { v1.push('0') } while (v2.length < len) { v2.push('0') } for (let i = 0; i < len; i++) { const num1 = parseInt(v1[i], 10) const num2 = parseInt(v2[i], 10)
if (num1 > num2) { return 1 } else if (num1 < num2) { return -1 } } return 0}
function gte(version) { // #ifdef MP-ALIPAY
SDKVersion = my.SDKVersion // #endif
return compareVersion(SDKVersion, version) >= 0;}export function canIUseCanvas2d() { // #ifdef MP-WEIXIN
return gte('2.9.2'); // #endif
// #ifdef MP-ALIPAY
return gte('2.7.15'); // #endif
// #ifdef MP-TOUTIAO
return gte('1.78.0'); // #endif
return false}
// #ifdef MP
export const prefix = () => { // #ifdef MP-TOUTIAO
return tt // #endif
// #ifdef MP-WEIXIN
return wx // #endif
// #ifdef MP-BAIDU
return swan // #endif
// #ifdef MP-ALIPAY
return my // #endif
// #ifdef MP-QQ
return qq // #endif
// #ifdef MP-360
return qh // #endif
}// #endif
/** * base64转路径 * @param {Object} base64 */export function base64ToPath(base64) { const [, format] = /^data:image\/(\w+);base64,/.exec(base64) || [];
return new Promise((resolve, reject) => { // #ifdef MP
const fs = uni.getFileSystemManager() //自定义文件名
if (!format) { reject(new Error('ERROR_BASE64SRC_PARSE')) } const time = new Date().getTime(); let pre = prefix() // #ifdef MP-TOUTIAO
const filePath = `${pre.getEnvInfoSync().common.USER_DATA_PATH}/${time}.${format}` // #endif
// #ifndef MP-TOUTIAO
const filePath = `${pre.env.USER_DATA_PATH}/${time}.${format}` // #endif
fs.writeFile({ filePath, data: base64.split(',')[1], encoding: 'base64', success() { resolve(filePath) }, fail(err) { console.error(err) reject(err) } }) // #endif
// #ifdef H5
// mime类型
let mimeString = base64.split(',')[0].split(':')[1].split(';')[0]; //base64 解码
let byteString = atob(base64.split(',')[1]); //创建缓冲数组
let arrayBuffer = new ArrayBuffer(byteString.length); //创建视图
let intArray = new Uint8Array(arrayBuffer); for (let i = 0; i < byteString.length; i++) { intArray[i] = byteString.charCodeAt(i); } resolve(URL.createObjectURL(new Blob([intArray], { type: mimeString }))) // #endif
// #ifdef APP-PLUS
const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now()) bitmap.loadBase64Data(base64, () => { if (!format) { reject(new Error('ERROR_BASE64SRC_PARSE')) } const time = new Date().getTime(); const filePath = `_doc/uniapp_temp/${time}.${format}` bitmap.save(filePath, {}, () => { bitmap.clear() resolve(filePath) }, (error) => { bitmap.clear() reject(error) }) }, (error) => { bitmap.clear() reject(error) }) // #endif
})}
/** * 路径转base64 * @param {Object} string */export function pathToBase64(path) { if (/^data:/.test(path)) return path return new Promise((resolve, reject) => { // #ifdef H5
let image = new Image(); image.setAttribute("crossOrigin", 'Anonymous'); image.onload = function() { let canvas = document.createElement('canvas'); canvas.width = this.naturalWidth; canvas.height = this.naturalHeight; canvas.getContext('2d').drawImage(image, 0, 0); let result = canvas.toDataURL('image/png') resolve(result); canvas.height = canvas.width = 0 } image.src = path + '?v=' + Math.random() image.onerror = (error) => { reject(error); }; // #endif
// #ifdef MP
if (uni.canIUse('getFileSystemManager')) { uni.getFileSystemManager().readFile({ filePath: path, encoding: 'base64', success: (res) => { resolve('data:image/png;base64,' + res.data) }, fail: (error) => { console.error({error, path}) reject(error) } }) } // #endif
// #ifdef APP-PLUS
plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => { entry.file((file) => { const fileReader = new plus.io.FileReader() fileReader.onload = (data) => { resolve(data.target.result) } fileReader.onerror = (error) => { reject(error) } fileReader.readAsDataURL(file) }, reject) }, reject) // #endif
})}
export function getImageInfo(path, useCORS) { const isCanvas2D = this && this.canvas && this.canvas.createImage return new Promise(async (resolve, reject) => { // let time = +new Date()
let src = path.replace(/^@\//,'/') if (cache[path] && cache[path].errMsg) { resolve(cache[path]) } else { try { // #ifdef MP || APP-PLUS
if (isBase64(path) && (isCanvas2D ? isPC : true)) { src = await base64ToPath(path) } // #endif
// #ifdef H5
if(useCORS) { src = await pathToBase64(path) } // #endif
} catch (error) { reject({ ...error, src }) } // #ifndef APP-NVUE
if(isCanvas2D && !isPC) { const img = this.canvas.createImage() img.onload = function() { const image = { path: img, width: img.width, height: img.height } cache[path] = image resolve(cache[path]) } img.onerror = function(err) { reject({err,path}) } img.src = src return } // #endif
uni.getImageInfo({ src, success: (image) => { const localReg = /^\.|^\/(?=[^\/])/; // #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO
image.path = localReg.test(src) ? `/${image.path}` : image.path; // #endif
if(isCanvas2D) { const img = this.canvas.createImage() img.onload = function() { image.path = img cache[path] = image resolve(cache[path]) } img.onerror = function(err) { reject({err,path}) } img.src = src return } // #ifdef APP-PLUS
// console.log('getImageInfo', +new Date() - time)
// ios 比较严格 可能需要设置跨域
if(uni.getSystemInfoSync().osName == 'ios' && useCORS) { pathToBase64(image.path).then(base64 => { image.path = base64 cache[path] = image resolve(cache[path]) }).catch(err => { console.error({err, path}) reject({err,path}) }) return } // #endif
cache[path] = image resolve(cache[path]) }, fail(err) { console.error({err, path}) reject({err,path}) } }) } })}
// #ifdef APP-PLUS
const getLocalFilePath = (path) => { if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path .indexOf('_downloads') === 0) { return path } if (path.indexOf('file://') === 0) { return path } if (path.indexOf('/storage/emulated/0/') === 0) { return path } if (path.indexOf('/') === 0) { const localFilePath = plus.io.convertAbsoluteFileSystem(path) if (localFilePath !== path) { return localFilePath } else { path = path.substr(1) } } return '_www/' + path}// #endif
|