開發過程中的一個需求:后端返回的一個base64格式的圖片顯示在頁面上,需要點擊保存該圖片到系統相冊。
一、觸發按鈕保存圖片到本地
uni-app將圖片存入系統的官方api是 uni.saveImageToPhotosAlbum(OBJECT),需要給定一個文件路徑filePath,但是這個路徑我們是沒辦法拿到的。
解決思路:需要用到Bitmap,把base64轉成bitmap文件對象,保存到系統相冊(但是此時某些手機上無法顯示出來,其實是保存成功的),然后使用uni.saveImageToPhotoAlbum方法將圖片成功保存並顯示。
1、Bitmap是原生圖片對象,其有個方法是loadBase64Data;於是我們首先創建一個bitmap對象:
2、然后使用loadBase64Data將base64字符串轉換為bitmap文件對象:
3、調用bimap.save方法,將圖片文件存入手機存儲(記得bitmap.clear(),比較占內存)
4、uni.saveImageToPhotoAlbum方法將圖片成功保存並顯示
整體代碼如下:
saveHeadImgFile() { let base64 = this.qrImgUrl; const bitmap = new plus.nativeObj.Bitmap("test"); bitmap.loadBase64Data(base64, function() { const url = "_doc/" + new Date().getTime() + ".png"; // url為時間戳命名方式 console.log('saveHeadImgFile', url) bitmap.save(url, { overwrite: true, // 是否覆蓋 // quality: 'quality' // 圖片清晰度 }, (i) => { uni.saveImageToPhotosAlbum({ filePath: url, success: function() { uni.showToast({ title: '圖片保存成功', icon: 'none' }) bitmap.clear() } }); }, (e) => { uni.showToast({ title: '圖片保存失敗', icon: 'none' }) bitmap.clear() }); }, (e) => { uni.showToast({ title: '圖片保存失敗', icon: 'none' }) bitmap.clear() }); }
二、長按保存到本地
1、封裝一個組件:saveImg.vue
<template>
<!-- 預覽圖片 -->
<view class="preview-photo-box flex-box">
<view class="item tc">
<image class="receive-qrcode-img" :src="url" mode="widthFix" @longtap="toSave"></image>
</view>
</view>
</template>
<script>
export default {
props: {
url: {
type: String,
default: ''
}
},
data() {
return {};
},
methods: {
hide() {
this.$emit('hide');
},
saveImgFile() {
let base64 = this.url;
const bitmap = new plus.nativeObj.Bitmap("test");
bitmap.loadBase64Data(base64, function() {
const url = "_doc/" + new Date().getTime() + ".png"; // url為時間戳命名方式
console.log('saveHeadImgFile', url)
bitmap.save(url, {
overwrite: true, // 是否覆蓋
// quality: 'quality' // 圖片清晰度
}, (i) => {
uni.saveImageToPhotosAlbum({
filePath: url,
success: function() {
uni.showToast({
title: '圖片保存成功',
icon: 'none'
})
bitmap.clear()
}
});
}, (e) => {
uni.showToast({
title: '圖片保存失敗',
icon: 'none'
})
bitmap.clear()
});
}, (e) => {
uni.showToast({
title: '圖片保存失敗',
icon: 'none'
})
bitmap.clear()
});
},
toSave() {
uni.showModal({
title: '圖片保存',
content: '確定要保存圖片嗎',
success: e => {
if (e['confirm']) {
this.saveImgFile();
}
}
});
}
}
};
</script>
<style lang="scss">
.preview-photo-box {
width: 100%;
height: 100%;
z-index: 99;
justify-content: center;
align-items: center;
.item {
.receive-qrcode-img {
position: relative;
z-index: 2;
width: 224upx;
height: 224upx;
margin: 0 auto;
}
}
}
</style>
