uniapp 小程序分享海報保存圖片踩坑

前言:第一次寫的時候,思路。

1:獲取權限>繪製canvas>保存canvas返回路徑,canvasToTempFilePath>圖片暫存downloadFile>保存圖片saveImageToPhotosAlbum

但是在開發小程序開發工具中在圖片暫存出現問題,因爲開發工具內downloadFile正常,到了手機微信報錯,因爲只能下載http文件,二手機返回的是“wxfile://***”暫存路徑,另就是canvas繪製的網絡圖片不顯示,本地圖片正常,所以繞了一下,先緩存網絡圖片。所以有了以下船新版本。

2:獲取權限>圖片暫存downloadFile>繪製canvas>保存canvas返回路徑,canvasToTempFilePath>保存圖片saveImageToPhotosAlbum

1:寫入canvas

<canvas  style="width: 100%;height: 1050upx;opacity: 0;" canvas-id="myCanvas"/>
        </canvas>

<view class="Saveshare"><view class="save" @click="csss">保存收款碼</view></view>

2:獲取保存圖片權限,一般寫頁面加載完成,看個人需求

wx.getSetting({
                success(res) {
                    if (!res.authSetting['scope.writePhotosAlbum']) {
                        wx.authorize({
                            scope: 'scope.writePhotosAlbum',
                            success() {
                                console.log('授權成功');
                            }
                        });
                    }
                }
            });

3:微信分享圖片如果有網絡圖片,需暫存本地,以後再佈置canvas。否則canvas圖片真機測試不顯示(本文圖片有http圖片,也有本地圖片)。

csss() {
            let that = this;
            wx.downloadFile({
            url: that.list.paymentCodeUrl,//此爲http圖片,需先暫存本地,地址爲“wxfile://***”
            success: function(res) {    }

         })     

   }                  
   4:繪製canvas

        const ctx = uni.createCanvasContext('myCanvas');
            ctx.rect(0, 0, 750, 80);
            ctx.setFillStyle('#FFFFFF');
            ctx.fill();
            let list = that.list.merchantName;
            let arr = list.split('');
            let name = '';
            let name1 = '';
            ctx.font = '28px bold 黑體';
            // 設置顏色
            ctx.fillStyle = '#000';
            // 設置水平對齊方式
            ctx.textAlign = 'center';
            // 設置垂直對齊方式
            ctx.textBaseline = 'middle';
            // 繪製文字(參數:要寫的字,x座標,y座標)//文字需居中換行所以只能遍歷折行
            if (arr.length < 12) {
                ctx.fillText(list, 200, 30);
            } else {
                for (let i = 0; i <= arr.length; i++) {
                    if (i <= 11) {
                        name += arr[i];
                    }
                }
                ctx.fillText(name, 200, 30);
                let arrs = arr.splice(12, 1);
                ctx.fillText(arrs, 200, 60);
            }
            ctx.beginPath();
            ctx.rect(0, 80, 750, 500);
            ctx.setFillStyle('#ff8b3d');
            ctx.fill();
            ctx.font = '30px bold 黑體';
            ctx.fillStyle = '#fff';
            // 設置垂直對齊方式
            ctx.textBaseline = 'middle';
            // 繪製文字(參數:要寫的字,x座標,y座標)
            ctx.fillText('付款碼', 200, 130);
            ctx.drawImage(res.tempFilePath, 65, 155, 250, 250);//網絡圖片已存本地
            ctx.drawImage('../../../static/img/hspics/752597618265658563.png', 70, 450, 50, 50);
            ctx.font = '18px bold 黑體';
            ctx.fillStyle = '#fff';
            // 設置垂直對齊方式
            ctx.textBaseline = 'middle';
            // 繪製文字(參數:要寫的字,x座標,y座標)
            ctx.fillText('樂花生 掃碼付款', 200, 480);
            ctx.draw();

5:保存canvas,保存canvas爲異步,需延時,否者繪製慢的情況下會沒有圖片

   setTimeout(function() {
                let that = this;
                uni.canvasToTempFilePath({
                    x: 0,
                    y: 0,
                    width: 750,
                    height: 750,
                    destWidth: 750,
                    destHeight: 1050,
                    canvasId: 'myCanvas',
                    success: function(res) {
                                            
                    }
                });
            }, 2000);

6:保存圖片

wx.saveImageToPhotosAlbum({
                                    filePath: res.tempFilePath,
                                    success: function(data) {
                                        wx.showToast({
                                            title: '保存成功',
                                            icon: 'success',
                                            duration: 2000
                                        });
                                    },
                                    fail: function(err) {
                                        if (err.errMsg === 'saveImageToPhotosAlbum:fail auth deny') {
                                            console.log('當初用戶拒絕,再次發起授權');
                                            wx.openSetting({
                                                success(settingdata) {
                                                    console.log(settingdata);
                                                    if (settingdata.authSetting['scope.writePhotosAlbum']) {
                                                        console.log('獲取權限成功,給出再次點擊圖片保存到相冊的提示。');
                                                    } else {
                                                        console.log('獲取權限失敗,給出不給權限就無法正常使用的提示');
                                                    }
                                                }
                                            });
                                        }
                                    },
                                    complete(res) {
                                    }
                                });        

至此結束,完整代碼。uniapp的自己改wx.  覺得可以記得星星。

https://github.com/jmyuyu/WeChatposter

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章