首頁 > web前端 > html教學 > 如何解決html5 canvas 繪製字體、圖片與圖形模糊問題

如何解決html5 canvas 繪製字體、圖片與圖形模糊問題

一个新手
發布: 2018-05-11 14:49:49
原創
4165 人瀏覽過

html5 canvas 繪製字體、圖片與圖形模糊問題

#發生狀況

##多出現在高dpi設備,這意味著每平方英寸有更多的像素,例如手機,平板電腦。當然很多高階桌上型電腦也有高解析度高dpi的顯示器。

 

canvas在瀏覽器中的縮放原理

#如果沒有設定style那麼就以html的屬性width, height作為尺寸。

如果設定了style中的width、height,那麼以其style設定為最終繪製到瀏覽器的尺寸。

也就是說,屬性中的寬高並不代表實際寬高,所以高dpi下會放大canvas,導致模糊。

canvas的width、height屬性是canvas的後緩衝尺寸,繪製到瀏覽器後會依照目前dpi進行縮放。

devicePixelRatio(window成員)保存了在高dpi狀態下屬性width/height被放大的比例。

 

錯誤的解決案例

#網路搜尋canvas 模糊,會有兩種解決方法,可能現在都不適合了。

一個是CanvasRenderingContext2D.translate(0.5,0.5);

  這個其實是在3D繪圖領域常用的,用來處理像素偏移,canvas的2d context已經處理了這方面的問題。

另一個是backingStorePixelRatio,你會看到類似下面這樣的程式碼,這個backingStorePixelRatio已經在新瀏覽器中被去掉了,我試過chrome與edge都已經不存在了。

var ctx = document.createElement("canvas").getContext("2d"),
        dpr = window.devicePixelRatio || 1,
        bsr = ctx.webkitBackingStorePixelRatio ||
              ctx.mozBackingStorePixelRatio ||
              ctx.msBackingStorePixelRatio ||
              ctx.oBackingStorePixelRatio ||
              ctx.backingStorePixelRatio || 1
登入後複製

我研究時使用了動態建立canvas的方法,樣式的width/height乘以縮放比devicePixelRatio得到canvas的屬性width/height。 <br/>

  這不是完美的解決方案,因為在瀏覽器的dpi發生變化時,例如用戶設置,或者從一個高dpi顯示器移動窗口到低dpi顯示器時發生。 (我1080p普通23吋顯示器是1.25倍,平板電腦是2.0倍,之間拖放視窗就會發生)

<code><span style="font-size: 14px"><strong><span style="font-family: Microsoft YaHei">解决方法</span></strong></span><br/><span style="font-family: Microsoft YaHei; font-size: 14px">1、动态创建并监视window的onresize事件,根据<span style="font-family: Consolas">devicePixelRatio</span>重建canvas。<br/>2、动态调整canvas样式的宽高,同样监视onresize事件。再配合<span style="font-family: Microsoft YaHei">CanvasRenderingContext2D.scale动态缩放绘制内容的比例。</span><br/></span><span style="font-family: Microsoft YaHei; font-size: 14px">浏览器都没有devicePixelRatio改变的事件,或者dpi改变的事件,如果你知道,请留言。</span><br/></code>
登入後複製

以上是如何解決html5 canvas 繪製字體、圖片與圖形模糊問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板