uni-app canvasToTempFilePath畫布問題


最近在做一個截圖功能,發現uni-app分享自定義圖片還是有點問題

APP端的分享和微信小程序分享還是有點不同的,這里APP測試用的是安卓手機

 

下面列舉下我遇到的問題

1.draw函數的回調不執行

    一般都是ctx.draw(false,()=>{})的方式執行,但是打印半天都不進入,發現是回調函數的問題,查了一會,最終還是在微信社區找到了解決方案,那就是強制執行函數

  ctx.draw(false,(()=>{})())

2.canvasToTempFilePath生成的圖片很模糊

    這在微信小程序也是存在的,方案大都是W450-H200變成W900-H400的放大畫布像素,而我在uni-app試了一點變化都木有還是模糊,還去小程序測了個demo,發現小程序沒問題,調大了也變清晰了

  就很納悶,然后瘋狂找了半天,uniapp社區方案還是太少了,然后又去微信社區,發現有人跟我碰到一樣的問題,作者下面回了句“我的是圖片太大的原因”,剛開始感覺應該不是,后面還是試了一下,

  真的是圖片大的原因。

    然后我就將畫布W450-H200變成W225-H100,縮小畫布0.5倍的像素,為了減少更多體積,我還用compressImage壓縮了一遍,經過微調后,分享的圖片真就清晰了好多,如果原圖100%,這個能達到

  85%的清晰,后面嘗試繼續縮小,那就不行了,開始模糊起來了。

  tip:這里雖然分享圖片雖然清晰了,但如果需要展示的話,展示圖片就模糊了,所以我就又生成了一張圖片用於展示,是麻煩了點0.0

3.canvasToTempFilePath生成的圖片臨時路徑

    _doc/temp 這樣的格式,不像小程序http那種臨時路徑,我用image組件和previewImage打開都是黑的,我以為是要轉成file,發現沒啥用,最后想了下以前畫布生成圖片的情況,那就是畫布沒畫完,然

        后趕緊去加了個延遲,完美,圖片出來了。

          ctx.draw(false, (() => {
                    setTimeout(()=>{
                        uni.canvasToTempFilePath({
                            canvasId: 'myCanvas',
                            destWidth: _this.cropW*_this.canvasScale*2, //分享圖片尺寸=畫布尺寸1*縮放比0.5*像素比2
                            destHeight: _this.cropH*_this.canvasScale*2,
                            quality:1,
                            fileType:'jpg',
                            success: (res) => {
                                // console.log(res,'success')
                                uni.compressImage({
                                    src: res.tempFilePath,
                                    quality: 100,
                                    success: res => {
                                        const share_img=res.tempFilePath
                                        uni.canvasToTempFilePath({
                                            canvasId: 'myCanvas',
                                            destWidth: _this.cropW*2,   //展示圖片尺寸=畫布尺寸1*像素比2
                                            destHeight: _this.cropH*2,
                                            quality:1,
                                            fileType:'jpg',
                                            success: (res) => {
                                                // console.log(res,'success')
                                                uni.hideLoading()
                                                const img = res.tempFilePath
                                                // _this.show = false
                                                _this.$emit('confirm', {
                                                    share_img,
                                                    img
                                                })
                                            },
                                        }, _this);
                                    }
                                })
                            },
                        }, _this);
                    },500)
                })())

 

 

感覺還是要記下,不然以后真的忘了。

 


免責聲明!

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



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