高清屏下canvas重置尺寸引起的問題

咱們知道,清空canvas畫布內容有如下兩個方法。
第一種方法是cearRect函數:html

context.cearRect(0,0,canvas.width,canvas.height)

第二種方法就是用原值從新設置一下canvas的寬(或者高)前端

canvas.width = canvas.width
// or 
canvas.height = canvas.height

第二種方法能夠起做用,是由於canvas的一個特色:html5

每當畫布的高度或寬度被重設時,畫布內容就會被清空。相關內容能夠參考 https://www.w3school.com.cn/html5/att_canvas_width.asp

在一個可視化項目中,咱們發如今一些電腦上面老是會出現效果錯亂的狀況。
通過調試,咱們發現,原來是「canvas.width = canvas.width」惹的禍。普通屏幕下面下不會有問題,可是若是屏幕是高清屏,就會出現問題。這是由於,高清屏下,咱們爲了處理繪製圖形模糊的問題,一般會作以下處理:程序員

function setupCanvas(canvas) {
        let width = canvas.width,
          height = canvas.height,
          dpr = window.devicePixelRatio || 1.0;
        if (dpr != 1.0 ) {
          canvas.style.width = width + "px";
          canvas.style.height = height + "px";
          canvas.height = height * dpr;
          canvas.width = width * dpr;
          ctx.scale(dpr, dpr);
        }
      }

咱們知道,高清屏下window.devicePixelRatio都大於1。因此在繪圖以前畫筆會被縮放:canvas

ctx.scale(dpr, dpr);

咱們知道cavnas是基於狀態的繪圖組件。 其中縮放比例值也在狀態管理之中。 當咱們從新設置canvas的寬(高也同樣)的時候,不只會清空canvas的畫布內容,同時還會把繪圖狀態重置到最原始的狀態,原始狀態下畫筆的縮放比例是1,縮放比例值會被重置爲1,於是致使繪製效果錯亂。架構

若是讀者不清楚「高清屏下canvas處理繪製圖形模糊及處理方式」和「canvas的繪製狀態」等知識點不清楚,建議學習相關知識,也推薦有興趣讀者,訂閱個人專欄:
Canvas高級進階 https://xiaozhuanlan.com/canvas,相關知識會在
本文也是摘錄自專欄的部份內容並改編而成的。

歡迎關注公衆號「ITman彪叔」。彪叔,擁有10多年開發經驗,現任公司系統架構師、技術總監、技術培訓師、職業規劃師。在計算機圖形學、WebGL、前端可視化方面有深刻研究。對程序員思惟能力訓練和培訓、程序員職業規劃有濃厚興趣。
ITman彪叔公衆號函數

相關文章
相關標籤/搜索