【經驗】微信小程式 canvas 圖片拉伸 對 wx.canvasToTempFilePath 截圖匯出的影響。
阿新 • • 發佈:2022-03-13
前言
canvas如果圖片出現了拉伸,wx.canvasToTempFilePath匯出的圖片會出現不可預測的奇怪不完整情況。所以咱們研究下。
介面說明
https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasToTempFilePath.html
測試用例
canvas在介面的尺寸:300,300
圖片尺寸:602,397
截圖座標:0,0,150,150
模式 none,canvas=介面尺寸,不拉伸
圖片沒有完全顯示,截圖匯出的圖片正好是canvas 顯示部分的100,150.
模式 scaleToFill,canvas= 圖片尺寸,出現拉伸
截圖的尺寸雖然是100x150,但是內容不是50%的畫面部分,而是更長了。
已知 canvas 介面尺寸長度=300,canvas 程式碼尺寸長度=397
按照縮放演算法,影象資料沒有壓縮,但是顯示壓縮了,所以如果寬度不變,高度150,實際上不失真的高度 = 397 * 300 / 602 = 197.840531561461794;
如果截圖的是150,則,實際上實在198,300的 canvas 上進行截圖。
所以如果按照顯示高度 = 300,要實現截圖50%,則計算出來 x = 150 / 300 * 397 * 300 / 602 = 150 * 397 / 602 = 98.920265780730897
這樣就正確的得到顯示部分的截圖;
模式 aspectFit, canvas= 縮放後介面尺寸,圖片完整顯示
同樣截圖 100,150尺寸的圖片:
同樣可以看到沒有被拉伸,正確截圖。
騰訊 BUG 發現:
如果canvas 初始化介面寬度是300,畫圖前調整為414,則截圖輸出會出錯。
但是如果一開始初始化就是414,則正確:
這個問題就是導致了匯出的 bug