麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > HTML5 > 正文

記一次高分屏下canvas模糊問題

2024-09-05 07:23:16
字體:
來源:轉載
供稿:網友

前言

最近在做項目的時候發現,在公司電腦上沒問題,在自己電腦上確有問題。做的是canvas的項目,在自己電腦上運行的時候,發現,會出現點擊選不中的問題還有,canvas刷新會有殘影問題。首先可以確定,這兩個問題都是canvas元素邊界有問題,但是從代碼上來看是沒問題的,因此我就猜測是否和屏幕有關,畢竟canvas某些問題確實和屏幕有關甚至和硬件顯卡有關。

devicePixelRatio屬性

果然找出一個屬性不同: devicePixelRatio;
然后仔細研究了下這個屬性的含義,mdn上解釋如下:

此屬性返回當前顯示設備的物理像素分辨率與CSS像素分辨率的比值。該值也可以被解釋為像素大小的比例:即一個CSS像素的大小相對于一個物理像素的大小的比值。

公司的臺式機的devicePixelRatio為1,而我自己的電腦為1.25;因為我的電腦是高清屏的,那么什么是高清屏呢?
高清顯示屏原理如下:

  1. 一種具備超高像素密度的液晶屏
  2. 同樣大小的屏幕上顯示的像素點由1個變為多個

那么我們就能知道,高清屏上一個像素點變成devicePixelRatio個像素點,因此canvas畫布也會收到影響,同樣的圖片,在高清屏上會變大,但是canvas實際尺寸沒有變大,因為圖片會縮放,導致模糊。

canvas寬高與css寬高

那么如何解決canvas高分屏問題呢?既然高分屏下canvas的像素點會變多,導致畫布縮放,那么我們能不能通過某種方法把canvas縮放回去呢?答案是可以的。
我們首先認識一下canvas的像素,我們先繪制一段文字

<canvas id="canvas1" width="300" height="150"></canvas>....ctx1.beginPath();ctx1.font = '20px arial';ctx1.fillText('Html5 canvas', 50, 50);

這樣我們就得到如下:

我們在創建一個畫布,這次我們通過css設置畫布的寬高:

<canvas id="canvas2" style="width: 200px; height: 200px"></canvas>.....ctx2.beginPath();ctx2.font = '20px arial';ctx2.fillText('Html5 canvas', 50, 50);

這次我們得到如下效果:

我們可以很明顯看到畫布上的文字有明顯的縮放,這是為什么呢?我們可以這么理解: canvas是繪制圖片的,我們使用canvas繪制完圖片后,首先生成一張根據canvas的寬高的圖片,然后通過dom樹由css渲染出來,因此canvas的寬高是圖片的實際寬高,css的寬高是實際渲染出來的尺寸。那么我們回過頭來理解devicePixelRatio,這個屬性返回的是設備的物理像素分辨率與CSS像素分辨率的比值,我們的canvas繪制出來后圖片因為高清屏設備的影響,導致圖片變大,然而我們在瀏覽器的渲染窗口并沒有變大,因此圖片會擠壓縮放使得canvas畫布會變得模糊,盡然高分屏的像素點變多了,導致圖片變大,那么我們可以通過設置canvas的寬高設置devicePixelRatio倍的畫布大小,然后設置canvas縮放比例為devicePixelRatio倍,保持和canvas等比例放大,然后這樣我們相當于在繪制圖片的時候就縮放圖片變大,然后通過css渲染又會縮放回去,這樣canvas的大小就不會失真了。代碼如下:

function makeHighRes(canvas) {    var ctx = canvas.getContext('2d');    // Get the device pixel ratio, falling back to 1.                   var dpr = window.devicePixelRatio || window.webkitDevicePixelRatio || window.mozDevicePixelRatio || 1;    // Get the size of the canvas in CSS pixels.    var oldWidth = canvas.width;    var oldHeight = canvas.height;    // Give the canvas pixel dimensions of their CSS    // size * the device pixel ratio.    canvas.width = Math.round(oldWidth * dpr);    canvas.height = Math.round(oldHeight * dpr);    canvas.style.width = oldWidth + 'px';    canvas.style.height = oldHeight + 'px';    // Scale all drawing operations by the dpr, so you    // don't have to worry about the difference.    ctx.scale(dpr, dpr);    return ctx;}

另外:網上有一些解決辦法比較古老,使用了backingStoreRatio 這個屬性,這個屬性已經廢棄!
此外我們也可以使用這個庫 hidpi-canvas-polyfill,他也是使用的我們這個方法來改變canvas繪制視圖的,不過庫中還把所有canvas繪制api都縮放了相應的devicePixelRatio倍,考慮很完善。

參考鏈接
https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/devicePixelRatio
https://www.jianshu.com/p/2cd5143cf9aa

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 草莓福利社区在线 | 亚洲aⅴ在线观看 | 午夜视频在线观看免费视频 | 日本在线播放一区 | 欧美14一15sex性hd | av国产在线被下药迷网站 | 成人nv在线观看 | 久久精品欧美电影 | 国产精品久久久久网站 | 九九黄色 | 国产精品一区二区x88av | 国产精品视频一区二区三区四区五区 | 男男羞羞视频网站国产 | 日本羞羞的午夜电视剧 | 国产精品国产三级国产在线观看 | 欧美高清另类自拍视频在线看 | av电影免费在线看 | 少妇一级淫片免费放正片 | 欧美女人天堂 | 欧美人人干| av观看网站 | 欧美在线一级 | 免费中文视频 | 亚洲一区 国产 | 在线播放h| 国内自拍网址 | 少妇一级淫片高潮流水电影 | 国产精品久久久久久久av三级 | 国产乱一区二区三区视频 | 日本不卡一区二区在线观看 | 亚洲综合色视频在线观看 | 中文字幕在线视频网站 | 亚洲一区二区中文 | 欧美日在线观看 | 伦一区二区三区中文字幕v亚洲 | 激情小说激情电影 | 激情影院在线观看 | 欧美巨乳在线观看 | 欧美亚洲国产一区 | 中文字幕22页 | 亚洲成人午夜精品 |