84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
我遇到一个问题,用canvas绘制图片的时候会模糊,但是用img显示的时候就不会,canvas和img的大小是相同的,求高手指点。
光阴似箭催人老,日月如移越少年。
用了@KevinYue 的例子,感觉不是很好使,我现在的解决方案,不管当前的devicePixelRatio的值是多少,统一将canvasDOM节点的width属性设置为其csswidth属性的两倍,同理将height属性也设置为cssheight属性的两倍,即:
devicePixelRatio
canvas
css
<canvas width="320" height="180" style="width:160px;height:90px;"></canvas>
这样整个canvas的坐标系范围就扩大为两倍,但是在浏览器的显示大小没有变,canvas画图的时候,按照扩大化的坐标系来显示,不清晰的问题就得以改善了。
我整理了一篇博客放在了这里,请移步。
不光绘制图片,在高分屏下,绘制文字和线条都会出现模糊的现象,具体的原因可以参考这里GitHub上有一个hidpi-canvas-polyfill可以很好的解决这个问题,但是没有对图片进行处理。如果你了解了原因,解决这个问题也很容易。
hidpi-canvas-polyfill
首先,引入上方这个polyfill;然后,得到devicePixelRatio和backingStorePixelRatio的比例,可以使用下面的方法:
polyfill
backingStorePixelRatio
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 ratio = getPixelRatio(ctx);
之后,在调用ctx.drawImage()的时候,给width和height乘以ratio,如下:
ctx.drawImage()
width
height
ratio
ctx.drawImage(document.querySelector('img'), 10, 10, 300 * ratio, 90 * ratio);
完整的deom参见这里,请在手机中打开查看效果。
//绘制图片 var images=new Array(8); var imagesSrc=new Array(8); for(var i = 0, dlen = data.length; i < dlen; i++){ images[i]=new Image(); imagesSrc[i] = data[i].img; //console.log(images[i]); } var rx = centerx, ry = centery; var px = 0, py = 90; var radius = ry - py; 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 ratio = getPixelRatio(ctx); //100积分 images[0].onload = function() { var angle = (40+0*45) * Math.PI / 180; var dx = rx + radius * Math.sin(angle); var dy = ry - radius * Math.cos(angle); ctx.save(); ctx.translate(dx, dy); ctx.rotate(angle); ctx.translate(-dx, -dy); // var imagesOne = images[0].src; // initImages(ctx,imagesOne); ctx.drawImage(images[0],dx - images[0].width / 2,dy - images[0].height/2,(images[0].width)*ratio, (images[0].height/2))*ratio; ctx.restore(); } images[0].src = imagesSrc[0];
@KevinYue 看这里
先放大 canvas,再用 CSS 将其限制回原始大小
用了@KevinYue 的例子,感觉不是很好使,我现在的解决方案,不管当前的
devicePixelRatio
的值是多少,统一将canvas
DOM节点的width属性设置为其css
width属性的两倍,同理将height属性也设置为css
height属性的两倍,即:这样整个canvas的坐标系范围就扩大为两倍,但是在浏览器的显示大小没有变,canvas画图的时候,按照扩大化的坐标系来显示,不清晰的问题就得以改善了。
我整理了一篇博客放在了这里,请移步。
不光绘制图片,在高分屏下,绘制文字和线条都会出现模糊的现象,具体的原因可以参考这里
GitHub上有一个
hidpi-canvas-polyfill
可以很好的解决这个问题,但是没有对图片进行处理。如果你了解了原因,解决这个问题也很容易。首先,引入上方这个
polyfill
;然后,得到
devicePixelRatio
和backingStorePixelRatio
的比例,可以使用下面的方法:之后,在调用
ctx.drawImage()
的时候,给width
和height
乘以ratio
,如下:完整的deom参见这里,请在手机中打开查看效果。
@KevinYue 看这里
先放大 canvas,再用 CSS 将其限制回原始大小