html5 canvas在高倍屏下变模糊的处理办法

一. 事起缘由

最近在用Canvas做社区网站的技能雷达图,如下图所示。

一倍屏下的显示情况:

 


 

二倍屏下的显示情况:


 

 

正当我很开心的准备发布出去时,用Mac Book 开发的同事跟我说,这简直是糊得不要不要的呀~( ?□? )~。。纳尼可是我的华硕显示十分完美呀,这就十分尴尬了。

猜想是Canvas毕竟类似于位图,在Retina屏下如果不做多倍屏显示处理的话,图片应该会模糊。Google了一翻,果然如此。

二. 问题分析

因为canvas不是矢量图,而是像图片一样是位图模式的。如果不做Retina屏适配的话,例如二倍屏,浏览器就会以2个像素点的宽度来渲染一个像素,该canvas在Retina屏幕下相当于占据了2倍的空间,相当于图片被放大了一倍,因此图片会变模糊。

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

三. 解决办法

因此,要做Retina屏适配,关键是知道当前canvas的实际渲染倍率,然后将canvas放大到该倍率来绘制,最后将canvas压缩成一倍的物理大小来展示。

需要注意的是,canvas中的线条大小、文字大小等都需要乘以该倍率来进行绘制。

3.1 canvas的实际渲染倍率

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

在canvas context中也存在一个 webkitBackingStorePixelRatio 的属性,该属性的值决定了浏览器在渲染canvas之前会用几个像素来来存储画布信息。在iOS6下的safari中的值是2,但是在chrome和iOS7的safari中的值却是1。在iOS6下的safari中,如果有一张100 × 100像素的图片绘制,该图片首先会在内存中生成一张200 × 200的图片,然后再浏览器渲染时会按100 × 100的图片来显示,因此不会出现模糊失真的情况。而在在chrome和iOS7的safari中就会出现模糊。

但是webkitBackingStorePixelRatio属性在各浏览器厂商的获取方式不一样,所以需要加上浏览器前缀来实现兼容。

如下:

var canvas = document.getElementById("canvas"),
        context= canvas.getContext("2d"); 

// 屏幕的设备像素比
var devicePixelRatio = window.devicePixelRatio || 1;

// 浏览器在渲染canvas之前存储画布信息的像素比
var backingStoreRatio = context.webkitBackingStorePixelRatio ||
                    context.mozBackingStorePixelRatio ||
                    context.msBackingStorePixelRatio ||
                    context.oBackingStorePixelRatio ||
                    context.backingStorePixelRatio || 1;

// canvas的实际渲染倍率
var ratio = devicePixelRatio / backingStoreRatio;
3.2 按实际渲染倍率来缩放canvas

先补充一个基础知识点:

要设置canvas的画布大小,使用的是canvas.width 和 canvas.height;
要设置画布的实际渲染大小,使用的style或CSS设置的 width 和height,只是简单的对画布进行缩放。
譬如:

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

因此,要使canvas适配高倍屏,就是要将canvas放大到设备像素比来绘制,最后将canvas压缩成一倍的物理大小来展示。如下:

canvas.style.width = canvas.width;
canvas.style.height = canvas.height;

canvas.width = canvas.width * ratio;
canvas.height = canvas.height * ratio;

3.3 实际渲染效果:

实际渲染效果如下:

一倍屏下:

<canvas width="200" height="120" style="width: 200px; height: 120px;"></canvas>

二倍屏下:

 

<canvas width="400" height="240" style="width: 200px; height: 120px;"></canvas>

三倍屏下:

 

<canvas width="600" height="360" style="width: 200px; height: 120px;"></canvas>
Perfect!

3.4 注意事项

canvas中的线条大小、文字大小等都需要乘以设备像素比来进行绘制,否则高倍屏下的线条会变细几倍

时间: 2024-07-31 05:37:05

html5 canvas在高倍屏下变模糊的处理办法的相关文章

Delphi2007编译的程序在Win7下图标模糊的解决办法_Delphi

使用Delphi2007编译GUI程序的时候会发现在Win7的状态栏中显示的程序图标非常模糊,如果原始的图标清晰度怎么样.造成这样结果的原因是因为Delphi2007生成的icon图标只符合XP等系统的要求,没有对Win7进行优化处理.网上有很多处理的方式,后来找到一个最简单有效的方法,就是只设置项目的图标而不要设置Form窗口的图标. 参考资料: Blurred Delphi Form Icon in Windows 7 Taskbar Delphi form icons are blurry

使用 HTML5 Canvas 实现移动平台动画(游戏)的一些痛点和思路

前言 最近一直在做一些HTML5 Canvas加速方面的事情,HTML5已经出来相当长一段时间,各浏览器厂商也基本上已经支持!从目前来看,HTML5的大规模普及还是雷声大,雨点小:但从长远来看,HTML5由于其诸多优点,比如本文提到到Canvas元素支持,将会逐渐成为主流,特别是在复杂场景应用中! 本文主要从目前HTML5 Canvas 在实现动画(游戏)中遇到的部分痛点入手,尝试提供一些相应的解决办法和思路! 痛点 性能问题:目前性能问题HTML5 Canvas的性能问题在Android中表现

windows8.1系统在高分屏下软件界面显示模糊怎么办

  1.首先在桌面空白处右键,点击个性化;然后点击显示; 2.然后勾选让我选择一个适合我的所有显示器的缩放级别,再选中较小-100%,点击应用,在弹出的窗口中选择选择立即注销. 3.再看到软件界面和图标都清晰显示了,不过字体和图标变小了,不要担心,这时再改变刚才选择的缩放等级为 中等 -125%,同样注销后,就都显示正常了. win8.1系统在高分屏下软件界面显示模糊的话,可以参考上述方法解决,简单实用的小技巧.

html5-PC下Safari或者macmini下Safari 给标签设置transform属性,字体会变模糊

问题描述 PC下Safari或者macmini下Safari 给标签设置transform属性,字体会变模糊 <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div style="background-color:black;height

html5 canvas全屏烟花动画特效

许多地方在春节.元宵等节日有放烟花的习俗,如果在网页上模拟烟花,以前也有一些javascript实现的效果,自从HTML5兴起之后,网页模拟烟花更加容易.逼真了. 效果展示:http://hovertree.com/texiao/html5/43/ 效果图: 代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta htt

8个经典炫酷的HTML5 Canvas动画欣赏

HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮助. 1.HTML5 Canvas可拖动的弹性大树摇摆动画 今天让我们继续来分享一个炫酷的HTML5动画,它是一款基于HTML5 Canvas的大树摇摆动画,这款HTML5动画的特点是我们可以拖拽树枝,从而让整棵树摇摆起来,这样就真实地模拟了大树从摇摆到静止的整个过程,相当逼真. 在线演示     

HTML5 Canvas API详解

HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C "工作草案" - 意味着它仍然处于开发阶段 - 它包含丰富的元素和属性,它们都支持现行的 HTML 4.01 版本规范.它还引入了几个新元素和属性,它们适用许多使用 web 页面的领域 - 音频.视频.图形.数据存储.内容呈现,等等.本文主要关注图形方面的增强:canvas. 新的 HTML5 canvas 是一个原生 HTML 绘图簿,用于 JavaScript 代码,不使用第三

HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

原文:HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难点分析. 我这几天刚好学习了一下,也趁着此刻有时间从需求分析.知识点.程序编写一步步给大家解剖下,要是在各位关公面前耍大刀了,可别见笑哟. 最终效果图如下: 图1 一.需求分析 1.圆形雪花 本示例中雪花形状使用圆

HTML5 Canvas性能分析与提升技巧

canvas代码也是有一些优化技巧的,我之前的几篇canvas的文章单纯涉及如何做使用canvas,下面看看别人是怎么说优化canvas性能的. 一:使用缓存技术实现预绘制,减少重复绘制Canvs内容 很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容 应该预先绘制缓存,而不是每次刷新. 直接绘制代码如下: context.font="24px Arial"; context.fillStyle="blue"; context.fillT