Files
yshop-pro-uniapp/hooks/useImage.js

154 lines
4.7 KiB
JavaScript
Raw Normal View History

2023-11-14 17:21:03 +08:00
/**
* @name: useImage
* @author: kahu4
* @date: 2023-11-07 16:34
* @descriptionuseImage
* @update: 2023-11-07 16:34
* */
export function useImage() {
/**
* options?: PreviewImageOptions
* @param options {PreviewImageOptions}
* @returns {Promise<unknown>}
*/
function preview(options) {
return new Promise((resolve, reject) => {
uni.previewImage({
indicator: 'default',
loop: true,
...options,
success: () => resolve(true),
fail: (err) => reject(err)
})
})
}
/**
* 获取图片信息
* @param src
* @returns {Promise<GetImageInfoSuccessData>}
*/
function getImageInfo(src) {
return new Promise((resolve, reject) => {
uni.getImageInfo({
src,
success: (res) => {
resolve(res)
},
fail: (error) => {
reject(error)
}
})
})
}
/**
* base64转换为path
* @param base64Data
* @returns {Promise<unknown>}
*/
function base64ToUrl(base64Data) {
return new Promise((resolve, reject) => {
// #ifdef H5
// 构建blob对象 data:image/png;base64,
const indexOf = base64Data.indexOf('base64,');
base64Data = base64Data.slice(indexOf + 7)
const byteCharacters = atob(base64Data);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], {type: 'image/png'});
// 创建一个链接指向这个blob
const url = URL.createObjectURL(blob);
resolve(url)
// #endif
// #ifdef MP-WEIXIN
const time = new Date().getTime();
const imgPath = wx.env.USER_DATA_PATH + "/poster" + time + "share" + ".png";
//如果图片字符串不含要清空的前缀,可以不执行下行代码.
const imageData = base64Data.replace(/^data:image\/\w+;base64,/, "");
const file = wx.getFileSystemManager();
file.writeFileSync(imgPath, imageData, "base64");
resolve(imgPath)
// #endif
// #ifdef APP-PLUS
const bitmap = new plus.nativeObj.Bitmap('test');
bitmap.loadBase64Data(
base64Data,
function () {
const url = '_doc/' + new Date() + '.png'; // url建议用时间戳命名方式
console.log('url:', url);
bitmap.save(
url,
{
overwrite: true // 是否覆盖
// quality: 'quality' // 图片清晰度
},
i => {
resolve(url)
},
e => {
bitmap.clear();
reject(e)
}
);
},
e => {
bitmap.clear();
reject(e)
}
);
// #endif
})
}
/**
* 保存图片到相册
* @param filePath
* @param name h5海报名称
* @returns {Promise<unknown>}
*/
function saveImageToPhotosAlbum(filePath, name = '') {
return new Promise((resolve, reject) => {
// #ifndef H5
uni.authorize({
scope: 'scope.writePhotosAlbum',
success() {
uni.saveImageToPhotosAlbum({
filePath,
success() {
resolve(true)
}
})
}
})
// #endif
// #ifdef H5
// 创建一个下载链接
const link = document.createElement('a');
link.href = filePath;
link.download = name;
// 添加它到DOM并触发点击
document.body.appendChild(link);
link.click();
// 确保我们释放这个URL以防止内存泄漏
document.body.removeChild(link);
window.URL.revokeObjectURL(filePath);
resolve(true)
// #endif
})
}
2023-11-14 17:21:03 +08:00
return {
preview,
getImageInfo,
base64ToUrl,
saveImageToPhotosAlbum
2023-11-14 17:21:03 +08:00
}
}