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

来源: http://www.css88.com/archives/9297

使用 canvas 绘制图片或者是文字在 Retina 屏中会非常模糊。如图:

因为 canvas 不是矢量图,而是像图片一样是位图模式的。高 dpi 显示设备意味着每平方英寸有更多的像素。也就是说二倍屏,浏览器就会以2个像素点的宽度来渲染一个像素,该 canvas 在 Retina 屏幕下相当于占据了2倍的空间,相当于图片被放大了一倍,因此绘制出来的图片文字等会变模糊。

因此,要做 Retina 屏适配,关键是知道当前屏幕的设备像素比,然后将 canvas 放大到该设备像素比来绘制,然后将 canvas 压缩到一倍来展示。

解决思路
在浏览器的 window 对象中有一个 devicePixelRatio 的属性,该属性表示了屏幕的设备像素比,即用几个(通常是2个)像素点宽度来渲染1个像素。

举例来说,假设 devicePixelRatio 的值为 2 ,一张 100×100 像素大小的图片,在 Retina 屏幕下,会用 2 个像素点的宽度去渲染图片的 1 个像素点,因此该图片在 Retina 屏幕上实际会占据 200×200 像素的空间,相当于图片被放大了一倍,因此图片会变得模糊。

类似的,在 canvas context 中也存在一个 backingStorePixelRatio 的属性,该属性的值决定了浏览器在渲染canvas之前会用几个像素来来存储画布信息。 backingStorePixelRatio 属性在各浏览器厂商的获取方式不一样,所以需要加上浏览器前缀来实现兼容。

解决问题
1.首先一样,获取 Canvas 对象:

JavaScript 代码:
var myCanvas = document.getElementById("my_canvas");
var context = myCanvas.getContext("2d");
2.获取像素比,将 Canvas 宽高进行放大,放大比例为:devicePixelRatio / webkitBackingStorePixelRatio , 我们写了一个兼容的方法。

JavaScript 代码:
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(context);
3.按实际渲染倍率来缩放canvas。

注意基础知识点:

要设置canvas的画布大小,使用的是 canvas.width 和 canvas.height;
要设置画布的实际渲染大小,使用的 style 属性或CSS设置的 width 和height,只是简单的对画布进行缩放。
2倍屏幕下示例代码:

HTML 代码:
<canvas width="640" height="800" style="width:320px; height:400px"></canvas>
canvas的实际大小的640px × 800px,但是实际渲染到页面的大小是320px × 400px,相当于缩小一倍来显示。

那么在3倍屏幕下就是:

HTML 代码:
<canvas width="960" height="1200" style="width:320px; height:400px"></canvas>
因此,要使canvas适配高倍屏,就是要将canvas放大到设备像素比来绘制,最后将canvas压缩成一倍的物理大小来展示。如下:

JavaScript 代码:
myCanvas.style.width = myCanvas.width + ‘px‘;
myCanvas.style.height = myCanvas.height + ‘px‘;

myCanvas.width = myCanvas.width * ratio;
myCanvas.height = myCanvas.height * ratio;
4.绘制

由于 Canvas 放大后,相应的绘制图片时也要放大,有两种方式:

第一种方法:每一个绘制相应的放大,比如我们绘制文字

JavaScript 代码:
context.font = "36px Georgia"; //一倍屏下18px字体
context.fillStyle = "#999";
context.fillText("我是清晰的文字", 50*ratio, 50*ratio);// 坐标位置乘以像素比
相对来说这个方法非常繁琐麻烦。

第二种方法:直接使用 scale 方法:

JavaScript 代码:
// 放大倍数
context.scale(ratio, ratio);

context.font = "18px Georgia";
context.fillStyle = "#999";
context.fillText("我是清晰的文字", 50, 50);
这样就可以解决 canvas 在高清屏中绘制模糊的问题

完整的demo:http://www.css88.com/demo/canvas_retina/index.html

原文地址:https://www.cnblogs.com/lanshengzhong/p/9077139.html

时间: 2024-08-05 22:50:28

【转】解决 canvas 在高清屏中绘制模糊的问题的相关文章

高清屏下canvas重置尺寸引发的问题

我们知道,清空canvas画布内容有以下两个方法. 第一种方法是cearRect函数: context.cearRect(0,0,canvas.width,canvas.height) 第二种方法就是用原值重新设置一下canvas的宽(或者高) canvas.width = canvas.width // or canvas.height = canvas.height 第二种方法可以起作用,是因为canvas的一个特点: 每当画布的高度或宽度被重设时,画布内容就会被清空.相关内容可以参考htt

移动端,多屏幕尺寸高清屏retina屏适配的解决方案

移动端高清.多屏适配方案 背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范往往会遵循以下两点: 首先,选取一款手机的屏幕宽高作为基准(以前是iphone4的320×480,现在更多的是iphone6的375×667). 对于retina屏幕(如: dpr=2),为了达到高清效果,视觉稿的画布大小会是基准的2倍,也就是说像素点个数是原来的4倍(对i

Qt ,mac osx ios x11 高清屏,视网膜的支持

Qt 5.0中添加了对于retina显示的基本支持.即将到来的Qt 5.1中提供了新的API和缺陷修复,对于这一问题进行了改进.Qt 4.8也获得了良好的支持,我们反向移植了一些Qt 5的补丁. 尽管这些实现的努力和Mac以及iOS程序员最为相关,但是来看一看其它平台是如何处理高DPI显示这一问题,也是很有趣的.这里主要有两种方式: 基于DPI缩放--Win32 GDI和KDE.在这种方式中,应用程序在全物理设备分辨率下工作,使用系统提供的一个DPI设定或者缩放因子,用于缩放布局.字体通常会被操

移动端高清屏适配方案

结论: 用户体验要求很高的页面,如UV较高的页面,活动页这些应该以用户体验优先,应用flexiable方案 在其它页面,固定视口,不缩放,使用rem做布局适配,js添加屏幕标识以便调整字体大小(即布局使用rem,字体使用百分比),使用@2x图片,只做ios8+的1px处理 面临的问题: 在不同大小和高清的屏幕下: 如何保证 界面布局 一致性:不错乱,不变形 如何保证 字体大小 一致性:大屏显示更大,小屏显示更小或更多 如何保证 1px边框 一致性:不同的高清屏也在正常显示1px的高度大小 如何保

Cocos2D iOS之旅:如何写一个敲地鼠游戏(一):高清屏显示和UIKit

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 原文由Ray Wunderlich写成,地址在: http://www.raywenderlich.com/2560/cocos2d-tutorial-for-ios-how

高清屏及适配不同设备的方案总结

关于一些Retina,设备像素,移动适配的知识,网上一搜也是一大把,但是基本的东西并没有变化太多.下面就我看过的一些有关于这方面的知识做一些总结(仅以个人的角度出发,所以有不全的地方还请大家谅解).后面会有不定期的更新~每个知识点我都会在开关写出引用地址,所以大家有不懂的可以看原文章~ 一.关于设备像素比(devicePixelRatio) 出处:高清屏概念解析与检测设备像素比的方法 所谓设备像素比(devicePixelRatio)指的就是设备上物理像素和设备独立像素(device-indep

[Tools] Kali Linux 高清屏扩大系统字体、软件字体

系统检索 Setting Manager,Appearance -> Settings,选择 Window Scaling:2x Terminal fonts: linux terminal 快捷键与 item2 的区别: item2 的轴心键是 command,linux terminal 的是 ctrl + shift. 所以打开新 tab,在 mac 上是 command + t, 在 linux 上是 ctrl + shift + t Software fonts,比如 BurpSuit

Cocos2D iOS之旅:如何写一个敲地鼠游戏(二):Cocos2D中的高清支持

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 高清显示和Cocos2D 好吧,有一个好消息 - 在最新版本的Cocos2D中包括了高清屏的完整支持,你可以用下面1-2-3步就可简单搞定! 在调用CCDirector的en

css图片高清适配

同一张图片,在普通屏显示正常,但高清屏出现模糊.原因是原来一个像素的点分成的四个像素的点进行了显示. 解决方案:在高清屏中把图片变成二倍图,前提是二倍的高清图已经存在. .icon{ background: url(bg.png) no-repeat; /* 宽200px; */ } @media screen and (-webkit-min-device-pixel-ratio:1.5){ .icon{ background-image: url(bgx2.png); /* 宽400px;