当前位置:首页 > JavaScript

js插件实现画笔绘图

2026-04-04 20:45:50JavaScript

使用 Canvas API 实现基础画笔功能

通过 HTML5 的 Canvas API 可以直接实现画笔绘图功能。以下是一个基础实现示例:

<canvas id="drawingCanvas" width="800" height="600"></canvas>
<script>
  const canvas = document.getElementById('drawingCanvas');
  const ctx = canvas.getContext('2d');
  let isDrawing = false;

  canvas.addEventListener('mousedown', startDrawing);
  canvas.addEventListener('mousemove', draw);
  canvas.addEventListener('mouseup', stopDrawing);
  canvas.addEventListener('mouseout', stopDrawing);

  function startDrawing(e) {
    isDrawing = true;
    draw(e);
  }

  function draw(e) {
    if (!isDrawing) return;

    ctx.lineWidth = 5;
    ctx.lineCap = 'round';
    ctx.strokeStyle = '#000000';

    ctx.lineTo(e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
    ctx.stroke();
    ctx.beginPath();
    ctx.moveTo(e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
  }

  function stopDrawing() {
    isDrawing = false;
    ctx.beginPath();
  }
</script>

使用 Fabric.js 库实现高级绘图

Fabric.js 是一个功能强大的 Canvas 库,简化了绘图操作:

js插件实现画笔绘图

<canvas id="fabricCanvas" width="800" height="600"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.3.1/fabric.min.js"></script>
<script>
  const canvas = new fabric.Canvas('fabricCanvas');
  let isDrawing = false;

  canvas.on('mouse:down', (o) => {
    isDrawing = true;
    const pointer = canvas.getPointer(o.e);
    canvas.freeDrawingBrush.width = 5;
    canvas.freeDrawingBrush.color = '#000000';
    canvas.isDrawingMode = true;
  });

  canvas.on('mouse:move', () => {
    if (!isDrawing) return;
  });

  canvas.on('mouse:up', () => {
    isDrawing = false;
    canvas.isDrawingMode = false;
  });
</script>

使用 Paper.js 实现矢量绘图

Paper.js 专注于矢量图形绘制:

<canvas id="paperCanvas" resize></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.12.17/paper-full.min.js"></script>
<script>
  paper.setup('paperCanvas');
  const path = new paper.Path();
  path.strokeColor = 'black';
  path.strokeWidth = 3;

  const tool = new paper.Tool();
  tool.onMouseDown = (event) => {
    path.add(event.point);
  };

  tool.onMouseDrag = (event) => {
    path.add(event.point);
  };
</script>

实现画笔属性控制

为绘图功能添加可配置的画笔属性:

js插件实现画笔绘图

// 画笔颜色选择
document.getElementById('colorPicker').addEventListener('change', (e) => {
  ctx.strokeStyle = e.target.value;
});

// 画笔粗细控制
document.getElementById('brushSize').addEventListener('input', (e) => {
  ctx.lineWidth = e.target.value;
});

// 橡皮擦功能
document.getElementById('eraserBtn').addEventListener('click', () => {
  ctx.strokeStyle = '#FFFFFF'; // 假设背景为白色
  ctx.globalCompositeOperation = 'destination-out'; // 或使用背景色
});

保存绘图结果

实现绘图结果的保存功能:

document.getElementById('saveBtn').addEventListener('click', () => {
  const dataURL = canvas.toDataURL('image/png');
  const link = document.createElement('a');
  link.download = 'drawing.png';
  link.href = dataURL;
  link.click();
});

移动端触摸支持

添加对移动设备触摸事件的支持:

canvas.addEventListener('touchstart', (e) => {
  e.preventDefault();
  const touch = e.touches[0];
  const mouseEvent = new MouseEvent('mousedown', {
    clientX: touch.clientX,
    clientY: touch.clientY
  });
  canvas.dispatchEvent(mouseEvent);
});

canvas.addEventListener('touchmove', (e) => {
  e.preventDefault();
  const touch = e.touches[0];
  const mouseEvent = new MouseEvent('mousemove', {
    clientX: touch.clientX,
    clientY: touch.clientY
  });
  canvas.dispatchEvent(mouseEvent);
});

以上方法提供了从基础到高级的画笔绘图实现方案,可以根据项目需求选择合适的实现方式。Canvas API 适合轻量级需求,Fabric.js 和 Paper.js 则提供了更丰富的功能和更简单的 API。

标签: 画笔插件
分享给朋友:

相关文章

uniapp 路由插件

uniapp 路由插件

在UniApp中,路由管理通常依赖框架内置的页面跳转API,但若需要更高级的路由功能(如动态路由、拦截器等),可通过以下插件或方案实现: 路由插件推荐 uni-simple-router 专为Uni…

react如何缓存一个插件

react如何缓存一个插件

缓存 React 插件的方法 在 React 中缓存插件或组件可以通过多种方式实现,具体取决于插件的类型和使用场景。以下是几种常见的方法: 使用 React.memo 缓存组件 React.mem…

react如何接入第三方插件

react如何接入第三方插件

接入第三方插件的方法 安装插件依赖 通过 npm 或 yarn 安装第三方插件的包。例如,安装 react-helmet: npm install react-helmet 导入插件到组件 在需…

react实现图片全选插件

react实现图片全选插件

实现思路 React 图片全选插件需要实现以下核心功能:展示图片列表、支持单选/全选操作、提供选中状态反馈。通过状态管理控制选中项,结合 UI 交互完成功能。 组件结构 ImageSelec…

php实现在线客服插件

php实现在线客服插件

实现基础功能 使用PHP结合WebSocket技术建立实时通信。安装Ratchet库(PHP WebSocket库),通过Composer进行安装: composer require cboden/…

php插件实现

php插件实现

PHP插件实现方法 PHP插件可以通过多种方式实现,具体取决于插件的用途和功能需求。以下是几种常见的实现方式: 扩展方式 通过PHP扩展(extension)实现插件功能,这是最底层的插件实现方式。…