Board logo

标题: 解决用canvas插入背景图片模糊的办法 [打印本页]

作者: xiexie    时间: 2019-8-19 16:44     标题: 解决用canvas插入背景图片模糊的办法

用canvas绘制图片的时候会模糊,但是用img显示的时候就不会,canvas和img的大小是相同的 

至于为什么会变模糊,这和浏览器处理 canvas 的方式有关,相关的文章可以参考这篇 High DPI Canvas,这里不作深入介绍。

下面是相关的代码:

<!-- 通过 img 标签引入图片,以便绘制到 canvas 中 -->

<img src="html5rocks.png" alt="" width="300" height="90"> 

  1. <canvas width="300" height="90"></canvas>
  2. <script>
  3. function init() {
  4. var canvas = document.querySelector('canvas');
  5. var ctx = canvas.getContext('2d');
  6. ctx.drawImage(document.querySelector('img'), 0, 0, 300, 90);
  7. }
  8. window.onload = init;
  9. </script>

解决问题:

其实,不只是绘制图片时会出现模糊的问题,正常情况下,在高清屏的设备下,任何绘制canvas中的图形(包括文字)都会出现模糊的问题。上面这个就是为了解决这个问题,但是他没有处理图片。

接下来,修改绘制图片的代码

将 init 含税修改成下面的代码

  1. function init() {
  2. var canvas = document.querySelector('canvas');
  3. var ctx = canvas.getContext('2d');
  4. // polyfill 提供了这个方法用来获取设备的 pixel ratio
  5. var getPixelRatio = function(context) {
  6. var backingStore = context.backingStorePixelRatio ||
  7. context.webkitBackingStorePixelRatio ||
  8. context.mozBackingStorePixelRatio ||
  9. context.msBackingStorePixelRatio ||
  10. context.oBackingStorePixelRatio ||
  11. context.backingStorePixelRatio || 1;
  12. return (window.devicePixelRatio || 1) / backingStore;
  13. };
  14. var ratio = getPixelRatio(ctx);
  15. // 注意,这里的 width 和 height 变成了 width * ratio 和 height * ratio
  16. ctx.drawImage(document.querySelector('img'), 0, 0, 300 * ratio, 90 * ratio);
  17. }

这个解决方案本质上是:

不管当前的devicePixelRatio的值是多少,统一将canvasDOM节点的width属性设置为其csswidth属性的两倍,同理将height属性也设置为cssheight属性的两倍,即:

<canvas width="320" height="180" style="width:160px;height:90px;"></canvas>

这样整个 canvas 的坐标系范围就扩大为两倍,但是在浏览器的显示大小没有变,canvas画图的时候,按照扩大化的坐系来显示,不清晰的问题就得以改善了
[ 本帖最后由 xiexie 于 2019-8-19 16:47 编辑 ]




欢迎光临 PHP开发笔记 (http://phpvi.com/) Powered by Discuz! 6.1.0