解决 canvas 在高清屏中绘制模糊的问题

解决 canvas 在高清屏中绘制模糊的问题

输入图片说明

1 解决方案 浏览器的对象 window 只有一个 属性是devicePixeRatio 的属性 。该属性表示了屏幕的设备像素比,即用几个像素宽度渲染一个像素的问题 举例子来说。 假设devicePixelRatio 的值为2 一张100/100 大小的图片 在Retina设备上 会用2个像素的空间。相当于图片放大了一倍,图片就会模糊 类似的,在 canvas context 中也存在一个 backingStorePixelRatio 的属性,该属性的值决定了浏览器在渲染canvas之前会用几个像素来来存储画布信息。 backingStorePixelRatio 属性在各浏览器厂商的获取方式不一样,所以需要加上浏览器前缀来实现兼容。 2 解决问题 【直接上代码】

<style>
      canvas {
        border: 1px solid red;
        width: 100%;
    }
  </style>
<body>
 <canvas id="canvas"  height="180"></canvas>
</body>
1> 模糊的情况
  // 原始做法
   var canvas =  document.getElementById("canvas");
   var ctx = canvas.getContext('2d');
   ctx.font = '18px Geprgia';
   ctx.fillStyle  = '#999';
   ctx.fillText('我是模糊的文字',50,50); 

      2> 清晰的情况
     // 获取像素比
   var getPixelRatio = function (context) {
           var backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
        return (window.devicePixelRatio || 1) / backingStore;
    };
    //画文字
    var myCanvas = document.getElementById("my_canvas");
    var context = myCanvas.getContext("2d");
    var ratio = getPixelRatio(context);
 
    myCanvas.style.width = myCanvas.width + 'px';
    myCanvas.style.height = myCanvas.height + 'px';
 
    myCanvas.width = myCanvas.width * ratio;
    myCanvas.height = myCanvas.height * ratio;
 
    // 放大倍数
    context.scale(ratio, ratio);
 
    context.font = "18px Georgia";
    context.fillStyle = "#999";
    context.fillText("我是清晰的文字", 50, 50);

转载于:https://my.oschina.net/u/3692906/blog/1818628

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101646.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 怎么提高开车技术_全日行车计划

    怎么提高开车技术_全日行车计划Description现在有n个城市,每个城市有它的高度HiH_i,保证每个HiH_i互不相同。我们定义两个城市之间的距离disi,j=|Hi−Hj|dis_{i,j}=|H_i-H_j|,并且只能从编号小的城市去到编号大的城市。现在有两个人,小A和小B要开车(雾)去旅行。小A先开一天,小B再开一天。每一天都可以从一个开到另一个城市。小A会选择去离当前城市第二近的城市,小B会选择去离当前城市最近的那

    2022年8月22日
  • 常见Android面试题及答案(详细整理)

    常见Android面试题及答案(详细整理)以下是一些常用的Android面试题及答案,有需要没需要都可以备着,希望能帮到大家。 1.请描述一下Activity生命周期。答:如下图所示。共有七个周期函数,按顺序分别是:onCreate(),onStart(),onRestart(),onResume(),onPause(),onStop(),onDestroy()。onCreate():创建Activit…

    2022年5月21日
  • inputstreamreader和inputstream_InputStream

    inputstreamreader和inputstream_InputStreampackagecsdn.java3;importorg.junit.Test;importjava.io.*;/***处理流之二:转换流的使用*1.转换流:属于字符流*InputStreamReader:将一个字节的输入流转换为字符的输入流*OutputStreamWriter:将一个字符的输出流转换为字节的输出流**2.作用:提供字节…

    2022年9月25日
  • 指数函数求导_常见求导公式表

    指数函数求导_常见求导公式表a^x=y求y'y'=d(a^x)/dx=lim(x->0):(a^(x+dx)-a^x)/dx(1)根据指数函数可推出:x^(y+z)=x^y*x^z所以(

    2022年8月2日
  • 免费申请国外免费域名超详细教程

    免费申请国外免费域名超详细教程1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
  • 风控模型面试问题[通俗易懂]

    风控模型面试问题[通俗易懂]本文转自他人作者:SummerMemories个人公众号:风控汪的数据分析之路知乎专栏:小鑫的数据分析笔记Q:互联网金融场景下的的风控模型种类?获客阶段:用户响应模型,风险预筛选模型。授信阶段:申请评分模型,反欺诈模型,风险定价模型,收益评分模型。贷后阶段:行为评分模型,交易欺诈模型,客户流失模型。催收阶段:早期催收模型,晚期催收模型。Q:简单描述一下风控建模的流程?前期准备…

    2022年6月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号