• <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
      <nav id="xcyjv"></nav>
    1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>

        關于canvas繪制模糊問題的解決方法

          發布時間:2019-09-24 15:51:32   作者:小鱷魚的大哥哦   我要評論
        這篇文章主要介紹了關于canvas繪制模糊問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

        模糊原因

        首先,需要理解canvas的展示機制。

        <canvas id="map" width="375" height="667"></canvas>

        我繪制了一張375px的canvas,iphone6的寬度也是375px,ok,canvas鋪滿了整個屏幕。

        那么canvas的大小就是375px,canvas類似于圖片,一張375px的圖片,我們就把它當做是圖片來看就好了。我,尖沙咀段坤說的。

        如果遇到了屏幕寬度400px的手機,那么圖片會 拉伸,canvas也會拉伸,拉伸則必然會模糊。

        那么iphone6確實是375px寬度的手機,還是會出現模糊問題,為什么呢?手機端會存在高清屏的問題。也就是我們說的2倍屏或者3倍屏,也叫作屏幕的DPI。高清屏在繪制界面時,會把2px的寬度渲染成1px,也就達到了高清的效果。也就是說,我們在高清屏下看到的375px其實是750個像素點繪制出來的,canvas其實是375px被拉伸到了750px再展示出來的,拉伸則必然會模糊。

        好了,模糊的原因知道了,其實就是高清屏所帶來的麻煩,怎么解決呢?

        解決方法

        如果是2倍屏,我們把設計圖上375px的canvas畫成750px不就解決了?

        設置canvas樣式

        這里我們不寫width和height,而直接寫style。把它看成是圖片,我們先不管圖片原寬高是多少,不管拉伸還是壓縮,直接讓他鋪滿整個屏幕。style里寫的寬高不是圖片的原寬高,也就是style里寫的寬高并不是canvas的真實寬高

        <canvas id="map" style="width: 375px;height:330px;"></canvas>

        設置canvas寬高

        上面的style并不是canvas的真實寬高,那么我們如何設置它的寬高呢?

        普通屏,2倍屏,3倍屏如果分別適配?

        <canvas id="map" style="width: 375px;height:330px;"></canvas>
        
        <script>
        let canvas = document.querySelector('#map');
        // 獲取到屏幕倒是是幾倍屏。
        let getPixelRatio = function(context) {
          var backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
           return (window.devicePixelRatio || 1) / backingStore;
        };
         // iphone6下得到是2 
        const pixelRatio = getPixelRatio(canvas);
        // 設置canvas的真實寬高
        canvas.width = pixelRatio * canvas.offsetWidth; // 想當于 2 * 375 = 750 
        canvas.height = pixelRatio * canvas.offsetHeight;
        </script>
        
        

        那么canvas的寬高就變成了下圖這樣,750寬度的canvas,如果你是2倍屏我就剛好能夠適應。!

        設置后的寬高

        開始畫點

        比如,375的設計圖上,有一個半徑為2px的圓點,點的位置是x:100,y:100。

        那么我們現在canvas的寬度是750,寬高變成了之前的2倍。為了視覺上位置保持不變,我們畫點的位置就應該是x:100*pixelRatio,y:100*pixelRatio。

        完整代碼如下:

        <canvas id="map" style="width: 375px;height:330px;"></canvas>
        
        <script>
        let canvas = document.querySelector('#map');
        // 獲取到屏幕倒是是幾倍屏。
        let getPixelRatio = function(context) {
          var backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
           return (window.devicePixelRatio || 1) / backingStore;
        };
         // iphone6下得到是2 
        const pixelRatio = getPixelRatio(canvas);
        // 設置canvas的真實寬高
        canvas.width = pixelRatio * canvas.offsetWidth; // 想當于 2 * 375 = 750 
        canvas.height = pixelRatio * canvas.offsetHeight;
        
        // 開始畫點
        let ctx = canvas.getContext("2d");
        ctx.beginPath();
         // 375設計圖上的位置和尺寸都應該*pixelRatio 因為我們現在的canvas是750
        ctx.arc(100*pixelRatio, 100*pixelRatio, 2*pixelRatio, 0, 2 * Math.PI);
        ctx.fillStyle = "#fff";
        ctx.fill();
        ctx.closePath();
        
        // ...你的其他代碼
        </script>

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

        相關文章

        最新評論

        01彩票网app
      1. <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
          <nav id="xcyjv"></nav>
        1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>
            霍邱 | 甘南 | 安阳 | 江苏苏州 | 图木舒克 | 黔南 | 葫芦岛 | 阿勒泰 | 阿拉善盟 | 改则 | 绥化 | 绍兴 | 绵阳 | 广安 | 萍乡 | 温州 | 慈溪 | 临猗 | 中山 | 克孜勒苏 | 南通 | 西藏拉萨 | 如东 | 余姚 | 瑞安 | 姜堰 | 醴陵 | 莆田 | 荣成 | 青海西宁 | 永新 | 天长 | 铜陵 | 延安 | 广安 | 永康 | 霍邱 | 丽江 | 河源 | 昭通 | 崇左 | 天长 | 平潭 | 青海西宁 | 商丘 | 天水 | 苍南 | 济宁 | 鞍山 | 随州 | 红河 | 广州 | 娄底 | 张掖 | 果洛 | 许昌 | 宝应县 | 新疆乌鲁木齐 | 梧州 | 南阳 | 淮南 | 萍乡 | 永康 | 正定 | 丹东 | 桂林 | 邹城 | 甘孜 | 乐清 | 衢州 | 琼海 | 三沙 | 鹤岗 | 台州 | 河源 | 鸡西 | 阳泉 | 昌吉 | 江苏苏州 | 库尔勒 | 余姚 | 阳泉 | 博罗 | 怒江 | 阿拉尔 | 马鞍山 | 嘉峪关 | 云浮 | 库尔勒 | 马鞍山 | 馆陶 | 黄南 | 德清 | 沧州 | 黑河 | 滕州 | 台中 | 呼伦贝尔 | 白山 | 内蒙古呼和浩特 | 石河子 | 天门 | 石狮 | 湖北武汉 | 乐清 | 宜昌 | 宿州 | 潍坊 | 垦利 | 永新 | 三门峡 | 玉林 | 淮北 | 玉环 | 亳州 | 沭阳 | 泰州 | 燕郊 | 如东 | 阜新 | 鹤岗 | 浙江杭州 | 达州 | 广安 | 广元 | 无锡 | 灌南 | 慈溪 | 仁怀 | 灌云 | 乐山 | 梧州 | 霍邱 | 山东青岛 | 青海西宁 | 海宁 | 株洲 | 德清 | 邳州 | 烟台 | 东方 | 吉安 | 文昌 | 大庆 | 聊城 | 九江 | 霍邱 | 龙口 | 新余 | 咸宁 | 乐清 | 安庆 | 丽江 | 桓台 | 宿迁 | 吉林 | 安阳 | 焦作 | 本溪 | 汕尾 | 巴彦淖尔市 | 清远 | 溧阳 | 镇江 | 昭通 | 大庆 | 玉溪 | 崇左 | 邹平 | 象山 | 澳门澳门 | 宿州 | 营口 | 张掖 | 三沙 | 象山 | 通化 | 禹州 | 雄安新区 | 白沙 | 高密 | 嘉善 | 梅州 | 仙桃 | 白银 | 深圳 | 连云港 | 亳州 | 潍坊 | 柳州 | 馆陶 | 临海 | 馆陶 | 海南海口 | 玉林 | 湖北武汉 | 灌云 | 海拉尔 | 泰安 | 娄底 | 潮州 | 苍南 | 吴忠 | 温州 | 宜春 | 迁安市 | 邯郸 | 吉林长春 | 高密 | 柳州 | 琼海 | 来宾 | 铜仁 | 黑河 | 南充 | 芜湖 | 黔东南 | 曲靖 | 双鸭山 | 温岭 | 鹤岗 | 大兴安岭 | 甘南 | 阳泉 | 菏泽 | 安庆 | 贵州贵阳 | 安阳 | 荆州 | 惠东 | 林芝 | 南平 | 昭通 | 贵州贵阳 | 庄河 | 丽江 | 台州 | 昌吉 | 东方 | 扬州 | 内江 | 简阳 | 来宾 | 阿坝 | 温州 | 临猗 | 晋城 | 南充 | 漯河 | 大同 | 遵义 | 秦皇岛 | 双鸭山 | 江门 | 克拉玛依 | 潍坊 | 济南 | 阿克苏 | 铜陵 | 宁国 | 陕西西安 | 迪庆 | 荣成 | 山东青岛 | 深圳 | 枣庄 | 昌吉 | 昭通 | 泰安 | 丹阳 | 海南海口 | 巴中 | 潍坊 | 黔西南 | 济南 | 白沙 | 泉州 | 博尔塔拉 | 东台 | 庆阳 | 馆陶 | 聊城 | 焦作 | 河池 | 盐城 | 庆阳 | 蓬莱 | 醴陵 | 福建福州 | 汕头 | 武威 | 大庆 | 白沙 | 潜江 | 启东 | 商洛 | 鹤壁 | 阿拉尔 | 昭通 | 遵义 | 林芝 | 偃师 | 湖北武汉 | 金昌 | 湘潭 | 茂名 | 瑞安 | 永康 | 湖州 | 吴忠 | 临夏 | 洛阳 | 基隆 | 佛山 | 巢湖 | 包头 | 贺州 | 海拉尔 | 南京 | 南京 | 阜阳 | 云浮 | 阿里 | 单县 | 玉溪 | 台山 | 新乡 | 中卫 | 营口 | 海宁 | 澄迈 | 临猗 | 七台河 | 仙桃 | 三亚 | 唐山 | 临沂 | 文山 | 柳州 | 乐清 | 宁国 | 达州 | 宝应县 | 永州 | 亳州 | 吉林 | 株洲 | 曲靖 | 徐州 | 金坛 | 盐城 | 绥化 | 天水 | 姜堰 | 保山 | 深圳 | 儋州 | 宜都 | 武安 | 克拉玛依 | 玉树 | 黄山 | 塔城 | 遂宁 | 果洛 | 芜湖 | 福建福州 | 枣阳 | 赤峰 | 鸡西 | 龙岩 | 沛县 | 黄山 | 启东 | 兴安盟 | 兴化 | 葫芦岛 | 营口 | 芜湖 | 五家渠 | 威海 | 克孜勒苏 | 五家渠 | 日喀则 | 湘潭 | 黔东南 | 怒江 | 双鸭山 | 泸州 | 阳江 | 三明 | 长兴 | 阿坝 | 那曲 | 朔州 | 晋城 | 渭南 | 金华 | 长葛 | 通化 | 金昌 | 台州 | 池州 | 阿拉尔 | 陵水 | 台北 | 芜湖 | 绥化 | 潍坊 | 济宁 | 燕郊 | 单县 | 沧州 | 渭南 | 阿坝 | 金坛 | 普洱 | 济源 | 庄河 | 江西南昌 | 永州 | 资阳 | 遂宁 | 安阳 | 承德 | 酒泉 | 库尔勒 | 铜陵 | 芜湖 | 荆州 | 徐州 | 昌都 | 辽宁沈阳 | 宜昌 | 内江 | 福建福州 | 大庆 | 海拉尔 | 定西 | 张北 | 延边 | 余姚 | 海丰 | 温州 | 海丰 | 汉川 | 阿坝 | 顺德 | 双鸭山 | 辽源 | 鄂州 | 日喀则 | 阿拉善盟 | 吉林长春 | 瓦房店 | 澳门澳门 | 白银 | 威海 | 绵阳 | 茂名 | 景德镇 | 雄安新区 | 白沙 | 临猗 | 怒江 | 贵州贵阳 | 伊犁 | 泗阳 | 通化 | 宜都 | 阿拉尔 | 六盘水 | 临沂 | 阿坝 | 朔州 | 舟山 | 柳州 | 启东 | 高密 | 孝感 | 随州 | 如东 | 青海西宁 | 玉林 | 湖北武汉 | 海北 | 焦作 | 西藏拉萨 | 琼海 | 安徽合肥 | 兴化 | 乌兰察布 | 黔南 | 吉林长春 | 哈密 | 海东 | 海宁 | 舟山 | 泰兴 | 灌南 | 晋江 | 荆州 | 鹤岗 | 海南 | 赤峰 | 克孜勒苏 | 铜陵 | 六盘水 | 正定 | 汝州 | 改则 | 江西南昌 | 偃师 | 阿克苏 | 防城港 | 宿州 | 丹阳 | 佛山 | 临汾 | 三亚 | 淮北 | 阿拉尔 | 佛山 | 上饶 | 泰州 | 武威 | 南充 | 梅州 | 滁州 | 黄南 | 基隆 | 台北 | 四川成都 | 灌云 | 伊春 | 燕郊 | 巴彦淖尔市 | 晋中 | 清远 | 蓬莱 | 嘉兴 | 塔城 | 日喀则 | 莱芜 | 台北 | 资阳 | 九江 | 阿拉尔 | 十堰 | 宜都 | 平凉 | 益阳 | 保定 | 金华 | 海东 | 三沙 | 辽源 | 丽江 | 铜仁 | 巢湖 | 贵州贵阳 | 赵县 | 灵宝 | 广州 | 鄂州 | 威海 | 贵州贵阳 | 澳门澳门 | 兴安盟 | 永州 | 梅州 | 姜堰 | 浙江杭州 | 山南 | 龙口 | 揭阳 | 宿迁 | 儋州 | 通辽 | 三沙 | 贺州 | 丽水 | 黑龙江哈尔滨 | 滨州 | 怀化 | 明港 | 天水 | 保定 | 鄢陵 | 安顺 | 绵阳 | 陕西西安 | 滨州 | 恩施 | 荆门 | 赣州 | 阿勒泰 | 黔东南 | 枣阳 | 德清 | 和县 | 甘肃兰州 | 邹平 | 日土 | 济南 | 南京 | 资阳 | 吴忠 | 桐乡 | 湖州 | 晋中 | 和县 | 台南 | 潜江 | 自贡 | 中卫 | 溧阳 | 大连 | 抚州 | 铜川 | 内江 | 许昌 | 陕西西安 | 惠州 | 东莞 | 南通 | 大理 | 余姚 | 红河 | 余姚 | 新余 | 百色 | 台南 | 吉林 | 潜江 | 包头 | 丹东 | 徐州 | 三门峡 | 阿勒泰 | 威海 | 石河子 | 莒县 | 台州 | 安阳 | 德宏 | 焦作 | 南阳 | 莒县 | 亳州 | 乐平 | 文昌 | 铜川 | 马鞍山 | 仁怀 | 香港香港 | 滨州 | 澳门澳门 | 牡丹江 | 海门 | 黔西南 | 溧阳 | 保定 | 杞县 | 临汾 | 运城 | 遵义 | 仙桃 | 玉环 | 阿拉善盟 | 渭南 | 蚌埠 | 伊犁 | 抚州 | 汕尾 | 江西南昌 | 蓬莱 | 铁岭 | 龙岩 | 铜陵 | 大丰 | 东台 | 抚顺 | 徐州 | 珠海 | 安吉 | 慈溪 | 大丰 | 肥城 | 黄山 | 宁波 | 日土 | 阿拉尔 | 永康 | 昌吉 | 威海 | 东阳 | 六盘水 | 包头 | 日土 | 衢州 | 莆田 | 莱州 | 阳江 | 新乡 | 三明 | 潍坊 | 武威 | 灌云 | 乳山 | 咸阳 | 慈溪 | 台中 | 崇左 | 荣成 | 宁波 | 济源 | 西藏拉萨 | 图木舒克 | 吐鲁番 | 金坛 | 晋中 | 伊犁 | 惠州 | 宜昌 | 保山 | 莒县 | 醴陵 | 临夏 | 岳阳 | 吉林长春 | 鸡西 | 青州 | 楚雄 | 广饶 | 塔城 | 溧阳 | 铜仁 | 双鸭山 | 包头 | 阳春 | 许昌 | 克拉玛依 | 任丘 | 龙岩 | 日土 | 伊春 | 平凉 | 三沙 | 大连 | 东营 | 温岭 | 桂林 | 海南海口 | 那曲 | 北海 | 湛江 | 宁波 | 永新 | 克孜勒苏 | 山西太原 | 黔西南 | 海东 | 庆阳 | 茂名 | 赵县 | 金华 | 台中 | 云浮 | 吉安 | 广饶 | 嘉峪关 | 海东 | 崇左 | 丹阳 | 曲靖 | 黑龙江哈尔滨 | 日喀则 | 昌都 | 厦门 | 乐山 | 贵州贵阳 | 南平 | 安岳 | 海南 | 澄迈 | 蚌埠 | 遵义 | 青州 | 来宾 | 济源 | 漳州 | 山西太原 | 台中 | 燕郊 | 台南 | 邳州 | 文山 | 延安 | 博罗 | 定安 | 乐山 | 遂宁 | 荆州 | 湘潭 | 台湾台湾 | 湖北武汉 | 台北 | 攀枝花 | 潜江 | 泗洪 | 宣城 | 乐清 | 改则 | 泰州 | 楚雄 | 东方 | 中卫 | 枣庄 | 任丘 | 明港 | 阿里 | 包头 | 江西南昌 | 曲靖 | 宿州 | 寿光 | 中卫 | 温州 | 仁怀 | 吉林 | 大连 | 襄阳 | 琼中 | 泉州 | 无锡 | 株洲 | 昌都 | 凉山 | 宁国 | 海西 | 博尔塔拉 | 明港 | 澳门澳门 | 淮北 | 邢台 | 宜昌 | 通辽 | 双鸭山 | 通辽 | 泰安 | 改则 | 鸡西 | 湖南长沙 | 涿州 | 西双版纳 | 陵水 | 六安 | 嘉峪关 | 济南 | 桓台 | 锦州 | 百色 | 单县 | 东海 | 东莞 | 文昌 | 河南郑州 | 丽水 | 绵阳 | 万宁 | 威海 | 日土 | 烟台 | 文昌 | 南京 | 涿州 | 安阳 | 徐州 | 临海 | 河源 | 漳州 | 单县 | 洛阳 | 北海 | 邹平 | 蚌埠 | 汝州 | 吉林 | 安徽合肥 | 香港香港 | 黔南 | 雅安 | 香港香港 | 云南昆明 | 嘉峪关 | 亳州 | 揭阳 | 黑河 | 玉林 | 滁州 | 亳州 | 赤峰 | 石嘴山 | 盐城 | 安吉 | 固原 | 克孜勒苏 | 鄢陵 | 海南 | 长垣 | 云南昆明 | 聊城 | 绥化 | 滁州 | 丹东 | 景德镇 | 日喀则 | 锡林郭勒 | 山南 | 武夷山 | 淮北 | 贵港 | 慈溪 | 玉林 | 抚顺 | 云南昆明 | 泗阳 | 吉安 | 临夏 | 肥城 | 商丘 | 迁安市 | 济南 | 威海 | 顺德 | 靖江 | 嘉峪关 | 资阳 | 吴忠 | 白山 | 延安 | 邹平 | 沧州 | 枣阳 | 张掖 | 遵义 | 昭通 | 东莞 | 苍南 | 滨州 | 保定 | 滁州 | 洛阳 | 沭阳 | 霍邱 | 昌吉 | 塔城 | 商洛 | 咸阳 | 郴州 | 枣阳 | 鞍山 | 南阳 | 瑞安 | 曹县 | 江门 | 泉州 | 咸宁 | 通化 | 文昌 | 汉川 | 白沙 | 漯河 | 博罗 | 灵宝 | 宝应县 | 贺州 | 荣成 | 安吉 | 保定 | 陕西西安 | 烟台 | 葫芦岛 | 昆山 | 鹰潭 | 昆山 | 湖南长沙 | 葫芦岛 | 铜川 | 无锡 | 潍坊 | 龙口 | 甘孜 | 西双版纳 | 吉林 | 汉川 | 红河 | 锡林郭勒 | 淮南 | 呼伦贝尔 | 荆门 | 赵县 | 赣州 | 海西 | 溧阳 | 仁怀 | 西双版纳 | 禹州 | 海宁 | 明港 | 昌吉 | 克拉玛依 | 襄阳 | 泗洪 | 神农架 | 桂林 | 衡阳 | 阜新 | 余姚 | 那曲 | 兴化 | 无锡 | 西双版纳 | 淄博 | 乐清 | 普洱 | 亳州 | 乌兰察布 | 洛阳 | 广汉 | 红河 | 平凉 | 邹城 | 迁安市 | 郴州 | 大丰 | 赣州 | 青海西宁 | 钦州 | 蓬莱 | 台湾台湾 | 襄阳 | 德州 | 永新 | 德州 | 泰安 | 岳阳 | 张掖 | 贵港 | 海安 | 丹阳 | 河池 | 三门峡 | 赣州 | 塔城 | 赤峰 | 菏泽 | 瑞安 | 乳山 | 邢台 | 湖州 | 林芝 | 江苏苏州 | 海拉尔 | 漯河 | 玉林 | 江西南昌 | 昌都 | 瓦房店 | 五家渠 | 昭通 | 阳江 | 临汾 | 基隆 | 钦州 | 辽阳 | 山西太原 | 楚雄 | 余姚 |