uniapp 實現base64格式圖片保存到相冊


開發過程中的一個需求:后端返回的一個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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM