有关canvas绘图模糊不清难题的处理方式

2021-02-22 16:26 jianzhan

模糊不清缘故

最先,必须了解canvas的展现体制。

<canvas id="map" width="375" height="667"></canvas>

我绘图了1张375px的canvas,iphone6的宽度也是375px,ok,canvas铺满了全部显示屏。

那末canvas的尺寸便是375px,canvas相近于照片,1张375px的照片,大家就把它作为是照片看来就行了。我,尖沙咀段坤说的。

假如遇到了显示屏宽度400px的手机上,那末照片会 拉伸,canvas也会拉伸,拉伸则必定会模糊不清。

那末iphone6的确是375px宽度的手机上,還是会出現模糊不清难题,为何呢?手机上端会存在高清屏的难题。也便是大家说的2倍屏或3倍屏,也叫作显示屏的DPI。高清屏在绘图页面时,会把2px的宽度3D渲染成1px,也就做到了高清的实际效果。也便是说,大家在高清屏下看到的375px实际上是750个像素点绘图出来的,canvas实际上是375px被拉伸到了750px再展现出来的,拉伸则必定会模糊不清。

好了,模糊不清的缘故了解了,实际上便是高清屏所带来的不便,如何处理呢?

处理方式

假如是2倍屏,大家把设计方案图上375px的canvas画成750px不就处理了?

设定canvas款式

这里大家不写width和height,而立即写style。把它当做是照片,大家先无论照片原宽高是是多少,无论拉伸還是缩小,立即让他铺满全部显示屏。style里写的宽高并不是照片的原宽高,也便是style里写的宽高其实不是canvas的真正宽高

<canvas id="map" style="width: 375px;height:330px;"></canvas>

设定canvas宽高

上面的style其实不是canvas的真正宽高,那末大家怎样设定它的宽高呢?

一般屏,2倍屏,3倍屏假如各自兼容?

<canvas id="map" style="width: 375px;height:330px;"></canvas>

<script>
let canvas = document.querySelector('#map');
// 获得到显示屏倒是是几倍屏。
let getPixelRatio = function(context) {
  var backingStore = context.backingStorePixelRatio ||
    context.webkitBackingStorePixelRatio ||
    context.mozBackingStorePixelRatio ||
    context.msBackingStorePixelRatio ||
    context.oBackingStorePixelRatio ||
    context.backingStorePixelRatio || 1;
   return (window.devicePixelRatio || 1) / backingStore;
};
 // iphone6下获得是2 
const pixelRatio = getPixelRatio(canvas);
// 设定canvas的真正宽高
canvas.width = pixelRatio * canvas.offsetWidth; // 想当于 2 * 375 = 750 
canvas.height = pixelRatio * canvas.offsetHeight;
</script>

那末canvas的宽高就变为了下图这样,750宽度的canvas,假如你是2倍屏我就恰好可以融入!!!

设定后的宽高

刚开始画点

例如,375的设计方案图上,有1个半径为2px的圆点,点的部位是x:100,y:100。

那末大家如今canvas的宽度是750,宽高变为了以前的2倍。以便视觉效果上部位维持不会改变,大家画点的部位就应当是x:100*pixelRatio,y:100*pixelRatio。

详细编码以下:

<canvas id="map" style="width: 375px;height:330px;"></canvas>

<script>
let canvas = document.querySelector('#map');
// 获得到显示屏倒是是几倍屏。
let getPixelRatio = function(context) {
  var backingStore = context.backingStorePixelRatio ||
    context.webkitBackingStorePixelRatio ||
    context.mozBackingStorePixelRatio ||
    context.msBackingStorePixelRatio ||
    context.oBackingStorePixelRatio ||
    context.backingStorePixelRatio || 1;
   return (window.devicePixelRatio || 1) / backingStore;
};
 // iphone6下获得是2 
const pixelRatio = getPixelRatio(canvas);
// 设定canvas的真正宽高
canvas.width = pixelRatio * canvas.offsetWidth; // 想当于 2 * 375 = 750 
canvas.height = pixelRatio * canvas.offsetHeight;

// 刚开始画点
let ctx = canvas.getContext("2d");
ctx.beginPath();
 // 375设计方案图上的部位和规格都应当*pixelRatio 由于大家如今的canvas是750
ctx.arc(100*pixelRatio, 100*pixelRatio, 2*pixelRatio, 0, 2 * Math.PI);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.closePath();

// ...你的别的编码
</script>

以上便是本文的所有內容,期待对大伙儿的学习培训有一定的协助,也期待大伙儿多多适用脚本制作之家。