Canvas 中图片和文字模糊通常是因为分辨率和绘制方式的问题。以下是一些解决方法:
1. 使用合适的画布大小和分辨率:
- 避免缩放: 尽量避免使用
context.scale()
来放大或缩小画布,这会导致像素拉伸和模糊。如果需要不同大小的输出,最好在创建 canvas 元素时就设置正确的width
和height
属性,例如:<canvas width="800" height="600"></canvas>
。 不要只用 CSS 样式来控制 canvas 的大小,这只会拉伸已绘制的内容。 - 高清屏幕适配: 对于高清屏幕 (Retina 显示屏等),设备像素比 (Device Pixel Ratio, DPR) 大于 1。为了避免模糊,需要将 canvas 的大小乘以 DPR,然后使用
context.scale()
将绘图上下文缩小相同的倍数。例如:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const dpr = window.devicePixelRatio || 1;
canvas.width = 800 * dpr;
canvas.height = 600 * dpr;
canvas.style.width = '800px'; // CSS 控制显示大小
canvas.style.height = '600px';
ctx.scale(dpr, dpr); // 缩放绘图上下文
2. 图片处理:
- 使用合适大小的图片: 避免使用过小的图片然后放大,这会导致像素化和模糊。尽量使用与显示尺寸相近或更大的图片。
- 预先缩放图片: 如果必须使用较小的图片并放大,可以先使用
Image
对象预加载图片,并在onload
事件中使用drawImage()
将其绘制到一个临时的离屏 canvas 上进行缩放,然后再将结果绘制到主 canvas 上。这可以提高缩放质量。
3. 文字渲染:
- 字体设置: 使用清晰的字体,并避免使用过小的字体大小。
font-smoothing
属性: 可以尝试使用 CSS 的font-smoothing
属性来改善文字渲染效果,例如-webkit-font-smoothing: antialiased;
。 不过不同浏览器和操作系统下的效果可能会有差异。textBaseline
属性: 正确设置textBaseline
属性可以使文字垂直对齐更精确,避免模糊。常用的值包括top
,hanging
,middle
,alphabetic
,ideographic
,bottom
。
4. 绘制技巧:
- 关闭抗锯齿: 在某些情况下,关闭抗锯齿 (
context.imageSmoothingEnabled = false;
) 可以提高清晰度,尤其是在绘制像素艺术风格的图形时。 - 离屏 canvas: 使用离屏 canvas 进行预渲染和合成可以提高性能和图像质量,尤其是在处理复杂的场景时。
示例:绘制清晰的文字
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const dpr = window.devicePixelRatio || 1;
canvas.width = 300 * dpr;
canvas.height = 150 * dpr;
canvas.style.width = '300px';
canvas.style.height = '150px';
ctx.scale(dpr, dpr);
ctx.font = '20px Arial';
ctx.textBaseline = 'middle';
ctx.textAlign = 'center';
ctx.fillText('清晰的文字', canvas.width / 2 / dpr, canvas.height / 2 / dpr);
通过以上方法,可以有效解决 Canvas 中图片和文字模糊的问题,提升绘图质量。 记住,根据具体情况选择合适的解决方案。
标签:canvas,const,dpr,模糊,ctx,height,width,图片 From: https://www.cnblogs.com/ai888/p/18576480