当前位置:首页 > JavaScript

js实现扫描图片效果

2026-03-01 22:33:14JavaScript

使用Canvas实现图片扫描效果

通过Canvas的getImageDataputImageData方法逐行或逐列处理像素数据,模拟扫描仪效果。以下是一个基础实现示例:

function scanImageEffect(imageElement, canvasElement, speed = 5) {
  const ctx = canvasElement.getContext('2d');
  canvasElement.width = imageElement.width;
  canvasElement.height = imageElement.height;

  let scanLine = 0;
  const totalHeight = imageElement.height;

  function draw() {
    ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);
    ctx.drawImage(imageElement, 0, 0);

    const imageData = ctx.getImageData(0, scanLine, canvasElement.width, 1);
    ctx.putImageData(imageData, 0, scanLine);

    scanLine += speed;
    if (scanLine < totalHeight) {
      requestAnimationFrame(draw);
    }
  }

  draw();
}

添加渐变扫描效果

通过调整像素数据的透明度实现渐变扫描效果:

js实现扫描图片效果

function gradientScanEffect(imageElement, canvasElement) {
  const ctx = canvasElement.getContext('2d');
  canvasElement.width = imageElement.width;
  canvasElement.height = imageElement.height;
  ctx.drawImage(imageElement, 0, 0);

  const imageData = ctx.getImageData(0, 0, canvasElement.width, canvasElement.height);
  const data = imageData.data;

  let revealHeight = 0;
  const gradientSize = 50;

  function animate() {
    ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);
    ctx.putImageData(imageData, 0, 0);

    for (let y = 0; y < revealHeight; y++) {
      for (let x = 0; x < canvasElement.width; x++) {
        const idx = (y * canvasElement.width + x) * 4;

        if (y > revealHeight - gradientSize) {
          const opacity = (revealHeight - y) / gradientSize;
          data[idx + 3] = opacity * 255;
        } else {
          data[idx + 3] = 255;
        }
      }
    }

    revealHeight += 2;
    if (revealHeight <= canvasElement.height) {
      requestAnimationFrame(animate);
    }
  }

  animate();
}

使用CSS遮罩实现扫描效果

纯CSS方案适用于简单场景,通过动画改变遮罩位置:

js实现扫描图片效果

<style>
  .scan-container {
    position: relative;
    overflow: hidden;
  }
  .scan-mask {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 10px;
    background: rgba(255, 255, 255, 0.7);
    animation: scan 3s linear infinite;
  }
  @keyframes scan {
    from { top: -10px; }
    to { top: 100%; }
  }
</style>

<div class="scan-container">
  <img src="your-image.jpg">
  <div class="scan-mask"></div>
</div>

高级扫描线效果

结合噪声和像素位移实现更真实的扫描效果:

function advancedScanEffect(imageElement, canvasElement) {
  const ctx = canvasElement.getContext('2d');
  canvasElement.width = imageElement.width;
  canvasElement.height = imageElement.height;

  let scanPosition = 0;
  const scanWidth = 2;
  const noiseIntensity = 0.1;

  function addNoise(imageData) {
    const data = imageData.data;
    for (let i = 0; i < data.length; i += 4) {
      const noise = (Math.random() - 0.5) * noiseIntensity * 255;
      data[i] += noise;     // R
      data[i + 1] += noise; // G
      data[i + 2] += noise; // B
    }
    return imageData;
  }

  function animate() {
    ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);
    ctx.drawImage(imageElement, 0, 0);

    const scanData = ctx.getImageData(0, scanPosition, canvasElement.width, scanWidth);
    const noisyData = addNoise(scanData);
    ctx.putImageData(noisyData, 0, scanPosition);

    scanPosition += 1;
    if (scanPosition < canvasElement.height) {
      requestAnimationFrame(animate);
    }
  }

  animate();
}

性能优化建议

对于大尺寸图片处理,建议使用离屏Canvas或Web Worker避免主线程阻塞:

// 使用离屏Canvas
const offscreenCanvas = document.createElement('canvas');
const offscreenCtx = offscreenCanvas.getContext('2d');
offscreenCanvas.width = imageElement.width;
offscreenCanvas.height = imageElement.height;
offscreenCtx.drawImage(imageElement, 0, 0);

以上方法可根据实际需求组合使用,调整扫描速度、宽度和特效强度等参数获得不同视觉效果。

标签: 效果图片
分享给朋友:

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

h5所能实现的效果

h5所能实现的效果

H5能实现的效果 H5(HTML5)作为最新的HTML标准,具备强大的功能和丰富的API支持,能够实现多种现代Web应用效果。以下是H5的主要能力分类: 多媒体支持 H5原生支持音频和视频播放,无…

vue实现图片单选

vue实现图片单选

Vue 实现图片单选功能 在 Vue 中实现图片单选功能可以通过多种方式完成,以下是两种常见的实现方法: 方法一:使用 v-model 和单选按钮 通过将单选按钮与图片绑定,利用 v-model…

vue实现吸附效果

vue实现吸附效果

实现吸附效果的基本思路 吸附效果通常指当页面滚动到某个位置时,元素固定在视口的特定位置。Vue中可以通过监听滚动事件结合CSS的position: sticky或动态样式切换实现。 使用CSS的p…

react如何渲染图片

react如何渲染图片

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

h5页面滑动效果实现

h5页面滑动效果实现

实现H5页面滑动效果的方法 H5页面滑动效果可以通过多种方式实现,包括原生JavaScript、CSS动画或第三方库。以下是几种常见的方法: 使用CSS Scroll Snap CSS Scroll…