当前位置:首页 > JavaScript

js实现图片打乱

2026-03-15 16:52:20JavaScript

使用 Canvas 打乱图片

通过 Canvas 将图片分割为多个小块并随机排列,实现视觉上的打乱效果。以下是实现代码:

js实现图片打乱

function scrambleImage(image, rows = 10, cols = 10) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.width = image.width;
  canvas.height = image.height;

  const tileWidth = Math.floor(image.width / cols);
  const tileHeight = Math.floor(image.height / rows);
  const tiles = [];

  for (let y = 0; y < rows; y++) {
    for (let x = 0; x < cols; x++) {
      tiles.push({
        x: x * tileWidth,
        y: y * tileHeight,
        width: tileWidth,
        height: tileHeight
      });
    }
  }

  const shuffledTiles = [...tiles].sort(() => Math.random() - 0.5);

  ctx.drawImage(image, 0, 0);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

  shuffledTiles.forEach((tile, index) => {
    const sourceTile = tiles[index];
    const tileData = ctx.getImageData(
      sourceTile.x, sourceTile.y, sourceTile.width, sourceTile.height
    );
    ctx.putImageData(tileData, tile.x, tile.y);
  });

  return canvas;
}

使用 CSS 打乱图片

通过 CSS 将图片分割为网格并随机排列位置,适合不需要像素级操作的场景:

js实现图片打乱

function cssScramble(imageElement, rows = 10, cols = 10) {
  const container = document.createElement('div');
  container.style.position = 'relative';
  container.style.width = `${imageElement.width}px`;
  container.style.height = `${imageElement.height}px`;

  const tileWidth = imageElement.width / cols;
  const tileHeight = imageElement.height / rows;

  for (let y = 0; y < rows; y++) {
    for (let x = 0; x < cols; x++) {
      const tile = document.createElement('div');
      tile.style.position = 'absolute';
      tile.style.width = `${tileWidth}px`;
      tile.style.height = `${tileHeight}px`;
      tile.style.backgroundImage = `url(${imageElement.src})`;
      tile.style.backgroundPosition = `-${x * tileWidth}px -${y * tileHeight}px`;
      tile.style.backgroundSize = `${imageElement.width}px ${imageElement.height}px`;
      tile.style.left = `${Math.random() * imageElement.width}px`;
      tile.style.top = `${Math.random() * imageElement.height}px`;
      container.appendChild(tile);
    }
  }

  return container;
}

使用像素操作打乱

直接操作像素数据实现更精细的控制,适合需要完全随机化的场景:

function pixelScramble(image) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.width = image.width;
  canvas.height = image.height;
  ctx.drawImage(image, 0, 0);

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

  for (let i = 0; i < data.length; i += 4) {
    const j = Math.floor(Math.random() * (data.length / 4)) * 4;
    [data[i], data[j]] = [data[j], data[i]];
    [data[i+1], data[j+1]] = [data[j+1], data[i+1]];
    [data[i+2], data[j+2]] = [data[j+2], data[i+2]];
    data[i+3] = data[j+3] = 255;
  }

  ctx.putImageData(imageData, 0, 0);
  return canvas;
}

注意事项

  • Canvas 方法会产生新的画布元素,需要手动添加到 DOM
  • 像素操作方式性能消耗较大,不适合大尺寸图片
  • CSS 方法不改变原始图片数据,适合需要动画过渡的场景
  • 打乱程度可通过调整行列参数控制,数值越大碎片化程度越高

标签: 图片js
分享给朋友:

相关文章

网页设计制作css图片

网页设计制作css图片

CSS图片处理基础方法 在网页设计中,CSS可以控制图片的尺寸、位置、边框等样式属性。通过<img>标签或背景图方式引入图片后,使用CSS属性进行调整。 img { width: 1…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…