zoukankan      html  css  js  c++  java
  • canvas绘图不清晰的解决方案

    canvas 作图经常会遇到canvas绘制的图片模糊不清问题,这种问题实际上是画布尺寸与画布范围内实际像素不一致造成的。了解 dpr

    width=600 height=400 

    原因分析

      假设dpr = 2;图片大小为60x60px;  

      1.DOM呈现图片过程

      图片——》浏览器css像素(显示尺寸)——》屏幕实际像素

      60x60              30x30                              60x60

      图片像素——》实际像素

      1: 1

      2.canvas绘制过程

      图片像素——》canvas像素(画布尺寸)——》css像素(显示尺寸)——》屏幕实际像素

      60x60               30x30                              30x30                          60x60

      图片像素——》画布像素——》实际像素

      4:                    1:                  4

      也就是说,canvas的绘制过程中图片到画布的过程中进行了像素的抽稀,画布到屏幕像素时又进行了插值,所以造成图片质量下降。

    解决方案

      放大画布的尺寸,但是canvas显示尺寸不变;

      图片像素——》canvas像素(画布尺寸)——》css像素(显示尺寸)——》屏幕实际像素

      60x60               60x60                                           30x30            60x60

      图片像素——》实际像素

      1:                1 

    width=600*dpr  height=400*dpr

    而canvas的设计的时候正好有对象的属性来分别管理画布尺寸和显示尺寸;canvas的width、height属性用于管理画布尺寸;canvas的style属性中的width、height正好是显示尺寸。

    也就是说解决方案就是设置画布尺寸与实际像素的一致,显示尺寸为正常显示尺寸;

    假设canvas的显示尺寸为窗口宽度,创建canvas的时候指定canvas的width属性为2 * body.clientHeight;style.widht为body.clientHeight + 'px';

      // 计算设备的dpr
            function setupCanvas(canvas) {
              var dpr = (scale = window.devicePixelRatio || 1);
              var rect = canvas.getBoundingClientRect();
              canvas.width = rect.width * dpr;
              canvas.height = rect.height * dpr;
              canvas.style.width = rect.width + "px"
              canvas.style.height = rect.height + "px"
              return canvas;
            }
  • 相关阅读:
    show parameters和强制索引失效
    ALTER INDEX 始末
    ADMIN OPTION和GRANT ANY OBJECT PRIVILEGE的问题
    oracle正则表达式函数简单总结(一)
    简单说一下Native Dynamic SQL(动态sql)和包DBMS_SQL
    金山快盘的文件上传
    桶中取黑白球问题
    读书笔记:编程之美求二进制数中1的个数
    vim配置文件.vimrc
    JVM内存管理
  • 原文地址:https://www.cnblogs.com/chrissong/p/10278377.html
Copyright © 2011-2022 走看看