当前位置:首页 > JavaScript

js实现图片擦除

2026-04-07 16:16:19JavaScript

实现图片擦除效果的方法

在JavaScript中实现图片擦除效果,可以通过Canvas API结合鼠标或触摸事件来完成。以下是两种常见的实现方式:

使用Canvas和鼠标事件

创建Canvas元素并加载图片,监听鼠标移动事件来擦除部分内容:

js实现图片擦除

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const img = new Image();

img.onload = function() {
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0);

  // 设置混合模式
  ctx.globalCompositeOperation = 'destination-out';

  let isDrawing = false;

  canvas.addEventListener('mousedown', () => isDrawing = true);
  canvas.addEventListener('mouseup', () => isDrawing = false);
  canvas.addEventListener('mousemove', erase);

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

    ctx.beginPath();
    ctx.arc(e.offsetX, e.offsetY, 20, 0, Math.PI * 2);
    ctx.fill();
  }
};

img.src = 'your-image.jpg';

使用CSS遮罩和鼠标位置

这种方法通过动态更新CSS遮罩来实现擦除效果:

const eraseArea = document.getElementById('erase-area');
let isErasing = false;

eraseArea.addEventListener('mousedown', () => isErasing = true);
eraseArea.addEventListener('mouseup', () => isErasing = false);
eraseArea.addEventListener('mousemove', (e) => {
  if(!isErasing) return;

  const x = e.clientX - eraseArea.getBoundingClientRect().left;
  const y = e.clientY - eraseArea.getBoundingClientRect().top;

  document.documentElement.style.setProperty('--erase-x', `${x}px`);
  document.documentElement.style.setProperty('--erase-y', `${y}px`);
});

对应的CSS样式:

js实现图片擦除

.erase-container {
  position: relative;
}

.erase-image {
  position: absolute;
  top: 0;
  left: 0;
}

.erase-area {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  -webkit-mask-image: radial-gradient(
    circle 20px at var(--erase-x, -100px) var(--erase-y, -100px),
    transparent 0%,
    black 0%
  );
}

实现触摸屏支持

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

canvas.addEventListener('touchstart', (e) => {
  e.preventDefault();
  isDrawing = true;
  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.addEventListener('touchend', () => {
  isDrawing = false;
});

添加擦除半径控制

允许用户调整擦除工具的大小:

const brushSize = document.getElementById('brush-size');

brushSize.addEventListener('input', function() {
  ctx.lineWidth = this.value;
});

// 更新擦除函数
function erase(e) {
  if(!isDrawing) return;

  ctx.beginPath();
  ctx.arc(e.offsetX, e.offsetY, ctx.lineWidth/2, 0, Math.PI * 2);
  ctx.fill();
}

这些方法提供了从基础到进阶的图片擦除实现,可以根据具体需求选择合适的方式或组合使用。Canvas方法更适合需要精细控制的情况,而CSS方法实现更简单但灵活性较低。

标签: 擦除图片
分享给朋友:

相关文章

vue2实现图片懒加载

vue2实现图片懒加载

实现图片懒加载的方法 在Vue2中实现图片懒加载可以通过以下方法完成,核心原理是监听图片是否进入可视区域,再动态加载图片资源。 使用IntersectionObserver API Intersec…

vue实现图片闪烁

vue实现图片闪烁

实现图片闪烁效果的方法 在Vue中实现图片闪烁效果可以通过CSS动画或JavaScript动态控制样式。以下是几种常见方法: CSS动画实现 通过@keyframes定义闪烁动画,并应用到图片元素上…

react如何渲染图片

react如何渲染图片

在React中渲染图片的方法 使用<img>标签直接引入本地图片 将图片文件放入项目目录(如src/assets),通过相对路径引入。需注意Webpack可能需要配置file-loader…

Vue实现图片 放大

Vue实现图片 放大

Vue实现图片放大功能 使用v-viewer插件 安装v-viewer插件: npm install v-viewer 在main.js中引入并配置: import Viewer from 'v-…

jquery图片切换

jquery图片切换

jQuery图片切换的实现方法 通过jQuery实现图片切换功能有多种方式,以下是几种常见的实现方法: 基础淡入淡出效果 $(document).ready(function(){ let…

vue实现加载图片

vue实现加载图片

Vue 实现图片加载的方法 在 Vue 中加载图片可以通过多种方式实现,以下是一些常见的方法: 使用静态资源路径 将图片放在 public 或 assets 目录下,通过相对路径或绝对路径引用。…