首页 > 其他分享 >用js怎么实现图片马赛克效果?

用js怎么实现图片马赛克效果?

时间:2024-12-04 09:34:13浏览次数:5  
标签:canvas const tileSize js 马赛克 data 图片

在前端 JavaScript 中,实现图片马赛克效果主要有两种方法:使用 Canvas API 和使用 SVG 滤镜。Canvas API 更为常见和灵活,以下提供使用 Canvas API 实现马赛克效果的代码示例和详细解释:

function mosaic(image, tileSize) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  const width = image.width;
  const height = image.height;

  canvas.width = width;
  canvas.height = height;

  ctx.drawImage(image, 0, 0);

  for (let x = 0; x < width; x += tileSize) {
    for (let y = 0; y < height; y += tileSize) {
      const data = ctx.getImageData(x, y, tileSize, tileSize);
      const averageColor = getAverageColor(data);
      ctx.fillStyle = `rgb(${averageColor.r}, ${averageColor.g}, ${averageColor.b})`;
      ctx.fillRect(x, y, tileSize, tileSize);
    }
  }

  return canvas.toDataURL();
}

function getAverageColor(imageData) {
  let r = 0, g = 0, b = 0;
  const data = imageData.data;

  for (let i = 0; i < data.length; i += 4) {
    r += data[i];
    g += data[i + 1];
    b += data[i + 2];
  }

  const count = data.length / 4;
  return {
    r: Math.floor(r / count),
    g: Math.floor(g / count),
    b: Math.floor(b / count),
  };
}


// 使用示例:
const img = document.getElementById('myImage'); // 获取图片元素
img.onload = function() {
  const mosaicDataURL = mosaic(img, 10); // tileSize 控制马赛克块大小
  const mosaicImg = document.createElement('img');
  mosaicImg.src = mosaicDataURL;
  document.body.appendChild(mosaicImg); // 显示马赛克图片
};

代码解释:

  1. mosaic(image, tileSize) 函数:

    • 接收一个图片元素 (image) 和马赛克块大小 (tileSize) 作为参数。
    • 创建一个 Canvas 元素和 2D 绘图上下文。
    • 将图片绘制到 Canvas 上。
    • 使用双重循环遍历图片,每次循环步长为 tileSize
    • getImageData(x, y, tileSize, tileSize) 获取每个马赛克块的像素数据。
    • getAverageColor(data) 计算马赛克块的平均颜色。
    • 使用平均颜色填充马赛克块 fillRect(x, y, tileSize, tileSize)
    • 返回马赛克图片的 Data URL。
  2. getAverageColor(imageData) 函数:

    • 接收 ImageData 对象作为参数。
    • 遍历像素数据,累加 R、G、B 值。
    • 计算平均 R、G、B 值并返回。
  3. 使用示例:

    • 获取图片元素。
    • 图片加载完成后,调用 mosaic 函数生成马赛克图片。
    • 创建一个新的图片元素,并将 src 设置为马赛克图片的 Data URL。
    • 将马赛克图片添加到页面中。

关键点和优化:

  • tileSize 控制马赛克块大小: 值越大,马赛克块越大,效果越明显。
  • 性能优化: 对于大型图片,可以考虑使用 Web Workers 在后台线程处理马赛克效果,避免阻塞主线程。
  • 其他效果: 可以修改 getAverageColor 函数,实现不同的颜色处理效果,例如取最暗/最亮颜色等。

SVG 滤镜方法 (简单示例):

<svg width="200" height="200">
  <filter id="mosaic">
    <feFlood flood-color="black" result="solidColor"/>
    <feComposite in="SourceGraphic" in2="solidColor" operator="in" result="shape"/>
    <feMorphology operator="dilate" radius="5" in="shape"/>  <!-- radius 控制马赛克大小 -->
    <feComposite in="SourceGraphic" in2="shape" operator="in"

标签:canvas,const,tileSize,js,马赛克,data,图片
From: https://www.cnblogs.com/ai888/p/18585559

相关文章

  • css的加载会阻塞js运行吗?为什么?
    CSS的加载会阻塞DOM树的构建,从而间接阻塞依赖DOM结构的JavaScript代码的执行,但不会阻塞其他JavaScript代码的下载和解析。具体来说:浏览器渲染过程:浏览器渲染页面需要构建DOM树(描述HTML结构)和CSSOM树(描述CSS样式),然后合并成渲染树,最终绘制到屏幕上。CSS......
  • 编写一个布局,让文字环绕在图片的周围
    有多种方法可以实现文字环绕图片的效果,以下是几种常见且有效的布局方案,并附带代码示例:1.使用float属性:这是最常用的方法,简单易懂。<divclass="container"><imgsrc="image.jpg"alt="Image"class="float-left"><p>这是一些环绕在图片周围的文字。这是一些环绕在图......
  • 在chrome中js的数组占用了多少内存?
    在Chrome中,JavaScript数组的内存占用取决于几个因素:数组元素的类型:这是影响最大的因素。基本类型(primitives):像数字(number),布尔值(boolean),空值(null),未定义(undefined)等,这些类型的值直接存储在数组中,占用空间相对固定。数字通常占用8字节(64......
  • 使用js生成1-10000的数组
    //Method1:Usingaforloop(mostcommonandgenerallyefficient)functiongenerateArray1(){constarr=[];for(leti=1;i<=10000;i++){arr.push(i);}returnarr;}//Method2:UsingArray.from()andkeys()(moreconcise)funct......
  • 你是如何排查js内存泄漏的?
    排查JavaScript内存泄漏是一个常见的前端性能优化任务。以下是一些常用的方法和工具:1.使用浏览器开发者工具:Memory标签页:这是ChromeDevTools中最常用的工具。HeapSnapshots:可以捕获JavaScript堆的快照,比较不同时间点的快照,找出哪些对象没有被垃圾回收,从而......
  • 请使用css3实现图片的平滑转换
    可以使用CSS3的transition属性来实现图片的平滑过渡效果。以下是一些常见的应用场景和示例代码:1.鼠标悬停时放大图片:<imgsrc="image.jpg"alt="MyImage">img{width:200px;height:150px;transition:transform0.3sease;/*定义过渡效果*/}img:hover......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
                   摘 要在网络信息的时代,众多的软件被开发出来,给业主带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,智慧小区管理系统只能以业主为导向,以产品的持续创新作为智慧小区管理系统最重要的竞争手段。系统采用了B/S结构,将......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
    摘要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对在线考试等问题,对如何通过计算机在线考试进行研究分析,然后开发设计出在线考试系统已解决问......
  • HTML5+CSS3+JS制作响应式旅游网站(源码含7个页面)
    一、网站描述主要使用HTML5+CSS3+JS技术,进行制作响应式旅游网站,该网站包含7个静态页面,分别是目的地、旅游攻略、特色行程、酒店预订、联系我们、注册页面、登录页面。其中,该旅游网站的官网首页,包含吸引眼球的主要横幅、导航菜单、推荐景点栏以及用户评价部分。页面整体以直观......
  • HTML+CSS+JS实现简单的图片切换效果
    代码如下<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>轮播图</title>&l......