You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
8.1 KiB
JavaScript
369 lines
8.1 KiB
JavaScript
5 months ago
|
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
|
||
|
|
||
|
|