You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Canvas网格绘制函数会出现双线效果?哪里存在计算错误?

Canvas网格绘制双线问题排查

存在的错误点

  • 变量赋值笔误:高度变量bh错误赋值为canvas.width,应该改为canvas.height,横纵边界计算错误直接导致网格绘制错位叠线
  • 宽高读取顺序错误:先读取了原始canvas的宽高,后续又修改了canvas的宽高属性,绘图用的边界值和实际画布尺寸不匹配
  • 配置项未生效:硬编码了const p = 0,没有使用配置中传入的gridPadding参数
  • 绘制边界计算错误:画布扩展了1px的空间,但循环终止条件用了原始宽高,导致边缘线重复绘制

修正后的代码

const defaultConfig: GridOptions = { color: '#000000', gridSize: 4, gridPadding: 0, strokeStyle: '#000000' };

export function CrossTemplate(
  gridOptions: Partial<GridOptions> = defaultConfig,
  canvas: HTMLCanvasElement,
): HTMLCanvasElement {
  const config = { ...defaultConfig, ...gridOptions };
  // 先存储原始画布宽高
  const originWidth = canvas.width;
  const originHeight = canvas.height;
  const p = config.gridPadding;
  // 计算调整后的画布尺寸
  const cw = originWidth + p * 2 + 1;
  const ch = originHeight + p * 2 + 1;

  const context = canvas.getContext('2d');
  // 先修改画布宽高(该操作会自动清空画布),再确认绘图边界
  canvas.height = ch;
  canvas.width = cw;
  const bw = originWidth;
  const bh = originHeight;

  if (!context) throw Error('Canvas context error');

  // 绘制竖线
  for (let x = 0; x <= bw; x += config.gridSize) {
    context.moveTo(0.5 + x + p, p);
    context.lineTo(0.5 + x + p, bh + p);
  }

  // 绘制横线
  for (let x = 0; x <= bh; x += config.gridSize) {
    context.moveTo(p, 0.5 + x + p);
    context.lineTo(bw + p, 0.5 + x + p);
  }

  context.strokeStyle = config.strokeStyle;
  context.stroke();

  return canvas;
}

原理说明

Canvas的1px线默认对齐像素格的中间点,如果坐标为整数,线条会占两个像素格的各一半,看起来变粗甚至出现双线,你加0.5偏移的逻辑本身是正确的,只是因为之前的尺寸计算错误,导致两条线的位置过于接近,才会呈现出双线效果,修正尺寸计算逻辑后即可恢复正常的单网格线效果。

内容的提问来源于stack exchange,提问作者user15361861

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:15:03