当前位置:首页 > 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
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js轮播图实现原理

js轮播图实现原理

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

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

jquery图片

jquery图片

jQuery 图片操作 jQuery 提供了多种方法来处理图片,包括加载、显示、隐藏、动画效果等。以下是一些常见的 jQuery 图片操作方法: 动态加载图片 使用 jQuery 的 attr()…

vue实现图片单选

vue实现图片单选

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