婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 記一次高分屏下canvas模糊問(wèn)題

記一次高分屏下canvas模糊問(wèn)題

熱門(mén)標(biāo)簽:如何查看地圖標(biāo)注 地圖標(biāo)注軟件打印出來(lái) 電話機(jī)器人技術(shù) 欣鼎電銷(xiāo)機(jī)器人 效果 高德地圖標(biāo)注商戶怎么標(biāo) 惡搞電話機(jī)器人 黃石ai電銷(xiāo)機(jī)器人呼叫中心 智能電銷(xiāo)機(jī)器人被禁用了么 ok電銷(xiāo)機(jī)器人

前言

最近在做項(xiàng)目的時(shí)候發(fā)現(xiàn),在公司電腦上沒(méi)問(wèn)題,在自己電腦上確有問(wèn)題。做的是canvas的項(xiàng)目,在自己電腦上運(yùn)行的時(shí)候,發(fā)現(xiàn),會(huì)出現(xiàn)點(diǎn)擊選不中的問(wèn)題還有,canvas刷新會(huì)有殘影問(wèn)題。首先可以確定,這兩個(gè)問(wèn)題都是canvas元素邊界有問(wèn)題,但是從代碼上來(lái)看是沒(méi)問(wèn)題的,因此我就猜測(cè)是否和屏幕有關(guān),畢竟canvas某些問(wèn)題確實(shí)和屏幕有關(guān)甚至和硬件顯卡有關(guān)。

devicePixelRatio屬性

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

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

公司的臺(tái)式機(jī)的devicePixelRatio為1,而我自己的電腦為1.25;因?yàn)槲业碾娔X是高清屏的,那么什么是高清屏呢?
高清顯示屏原理如下:

  1. 一種具備超高像素密度的液晶屏
  2. 同樣大小的屏幕上顯示的像素點(diǎn)由1個(gè)變?yōu)槎鄠€(gè)

那么我們就能知道,高清屏上一個(gè)像素點(diǎn)變成devicePixelRatio個(gè)像素點(diǎn),因此canvas畫(huà)布也會(huì)收到影響,同樣的圖片,在高清屏上會(huì)變大,但是canvas實(shí)際尺寸沒(méi)有變大,因?yàn)閳D片會(huì)縮放,導(dǎo)致模糊。

canvas寬高與css寬高

那么如何解決canvas高分屏問(wèn)題呢?既然高分屏下canvas的像素點(diǎn)會(huì)變多,導(dǎo)致畫(huà)布縮放,那么我們能不能通過(guò)某種方法把canvas縮放回去呢?答案是可以的。
我們首先認(rèn)識(shí)一下canvas的像素,我們先繪制一段文字

<canvas id="canvas1" width="300" height="150"></canvas>
....


ctx1.beginPath();
ctx1.font = '20px arial';
ctx1.fillText('Html5 canvas', 50, 50);

這樣我們就得到如下:

我們?cè)趧?chuàng)建一個(gè)畫(huà)布,這次我們通過(guò)css設(shè)置畫(huà)布的寬高:

<canvas id="canvas2" style="width: 200px; height: 200px"></canvas>
.....



ctx2.beginPath();
ctx2.font = '20px arial';
ctx2.fillText('Html5 canvas', 50, 50);

這次我們得到如下效果:

我們可以很明顯看到畫(huà)布上的文字有明顯的縮放,這是為什么呢?我們可以這么理解: canvas是繪制圖片的,我們使用canvas繪制完圖片后,首先生成一張根據(jù)canvas的寬高的圖片,然后通過(guò)dom樹(shù)由css渲染出來(lái),因此canvas的寬高是圖片的實(shí)際寬高,css的寬高是實(shí)際渲染出來(lái)的尺寸。那么我們回過(guò)頭來(lái)理解devicePixelRatio,這個(gè)屬性返回的是設(shè)備的物理像素分辨率與CSS像素分辨率的比值,我們的canvas繪制出來(lái)后圖片因?yàn)楦咔迤猎O(shè)備的影響,導(dǎo)致圖片變大,然而我們?cè)跒g覽器的渲染窗口并沒(méi)有變大,因此圖片會(huì)擠壓縮放使得canvas畫(huà)布會(huì)變得模糊,盡然高分屏的像素點(diǎn)變多了,導(dǎo)致圖片變大,那么我們可以通過(guò)設(shè)置canvas的寬高設(shè)置devicePixelRatio倍的畫(huà)布大小,然后設(shè)置canvas縮放比例為devicePixelRatio倍,保持和canvas等比例放大,然后這樣我們相當(dāng)于在繪制圖片的時(shí)候就縮放圖片變大,然后通過(guò)css渲染又會(huì)縮放回去,這樣canvas的大小就不會(huì)失真了。代碼如下:

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;
}

另外:網(wǎng)上有一些解決辦法比較古老,使用了backingStoreRatio 這個(gè)屬性,這個(gè)屬性已經(jīng)廢棄!
此外我們也可以使用這個(gè)庫(kù) hidpi-canvas-polyfill,他也是使用的我們這個(gè)方法來(lái)改變canvas繪制視圖的,不過(guò)庫(kù)中還把所有canvas繪制api都縮放了相應(yīng)的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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:金昌 阿壩 赤峰 萍鄉(xiāng) 綏化 盤(pán)錦 中山 聊城

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《記一次高分屏下canvas模糊問(wèn)題》,本文關(guān)鍵詞  記,一,次高,分屏,下,canvas,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《記一次高分屏下canvas模糊問(wèn)題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于記一次高分屏下canvas模糊問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 通许县| 仙游县| 武穴市| 昌吉市| 阳朔县| 贵溪市| 精河县| 肇源县| 开阳县| 永泰县| 大荔县| 梅州市| 丰原市| 大埔区| 丹巴县| 孟津县| 冀州市| 同德县| 塔城市| 兴和县| 德惠市| 潜山县| 新民市| 胶南市| 青冈县| 清涧县| 曲水县| 同德县| 皮山县| 泰顺县| 定襄县| 五常市| 林周县| 铜山县| 玉树县| 吴旗县| 广水市| 山阴县| 阿克| 丹江口市| 霍邱县|