前端特效必备!打造酷炫马赛克和灰色滤镜,让你的图片变得与众不同!

news2024/9/26 3:30:24

一、引言

引言: 在现代前端开发中,图像处理是一个不可忽视的重要环节。本篇博客将带您领略前端图像处理的魅力,通过Canvas和算法实现几个炫酷特效:马赛克和灰色滤镜、模糊等。让我们一起给图片增添马赛克的神秘感和灰色滤镜的怀旧风情,让您的前端项目脱颖而出!

二、Canvas基础

首先,我们会简单介绍Canvas的基础知识,了解如何在HTML中画布上绘制图像,并获取Canvas的神奇画笔。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Canvas黑白滤镜示例</title>
</head>
<body>
  <canvas id="canvas" width="400" height="300"></canvas>
  <script src="script.js"></script>
</body>
</html>

原图:


三、马赛克滤镜  

接着,让我们学习如何通过马赛克滤镜,将图像分割成小方块,为您的图片增加神秘的马赛克特效。我们将实现简单的均值马赛克算法,使您的图片变得与众不同!

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

const img = new Image();
img.onload = function() {
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  // 算法实现马赛克滤镜效果
  const pixelSize = 8; // 马赛克块的大小,值越大,马赛克效果越明显

  for (let y = 0; y < canvas.height; y += pixelSize) {
    for (let x = 0; x < canvas.width; x += pixelSize) {
      let r = 0, g = 0, b = 0;
      let count = 0;
      for (let ky = 0; ky < pixelSize; ky++) {
        for (let kx = 0; kx < pixelSize; kx++) {
          const index = ((y + ky) * canvas.width + (x + kx)) * 4;
          r += data[index];
          g += data[index + 1];
          b += data[index + 2];
          count++;
        }
      }
      const averageR = Math.floor(r / count);
      const averageG = Math.floor(g / count);
      const averageB = Math.floor(b / count);

      for (let ky = 0; ky < pixelSize; ky++) {
        for (let kx = 0; kx < pixelSize; kx++) {
          const index = ((y + ky) * canvas.width + (x + kx)) * 4;
          data[index] = averageR;
          data[index + 1] = averageG;
          data[index + 2] = averageB;
        }
      }
    }
  }

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

// 替换为您的图片路径
img.src = 'path/to/your/image.jpg'; // 示例使用了一个简单的占位图片

效果: 

四、灰色滤镜

接下来,我们将用黑色滤镜的技术为图片增添怀旧的灰色风情。通过RGB值的处理,让您的图片变成复古怀旧的效果,为您的前端项目增色不少!

const img = new Image();
img.onload = function() {
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  // 算法实现黑白滤镜效果
  for (let i = 0; i < data.length; i += 4) {
    const average = (data[i] + data[i + 1] + data[i + 2]) / 3;
    data[i] = data[i + 1] = data[i + 2] = average; // R、G、B值设为平均值,形成黑白效果
  }

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

// 替换为您的图片路径
img.src = 'https://via.placeholder.com/400x300'; // 示例使用了一个简单的占位图片

效果:

 

五、模糊滤镜

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

const img = new Image();
img.onload = function() {
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  // 算法实现模糊滤镜效果(均值模糊)
  const blurRadius = 5; // 模糊半径,值越大,模糊程度越高
  const kernelSize = blurRadius * 2 + 1;
  const kernel = Array(kernelSize * kernelSize).fill(1 / (kernelSize * kernelSize)); // 均值滤波核

  for (let y = blurRadius; y < canvas.height - blurRadius; y++) {
    for (let x = blurRadius; x < canvas.width - blurRadius; x++) {
      let r = 0, g = 0, b = 0;
      for (let ky = 0; ky < kernelSize; ky++) {
        for (let kx = 0; kx < kernelSize; kx++) {
          const index = ((y + ky - blurRadius) * canvas.width + (x + kx - blurRadius)) * 4;
          r += data[index] * kernel[ky * kernelSize + kx];
          g += data[index + 1] * kernel[ky * kernelSize + kx];
          b += data[index + 2] * kernel[ky * kernelSize + kx];
        }
      }
      const dataIndex = (y * canvas.width + x) * 4;
      data[dataIndex] = r;
      data[dataIndex + 1] = g;
      data[dataIndex + 2] = b;
    }
  }

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

// 替换为您的图片路径
img.src = 'path/to/your/image.jpg'; // 示例使用了一个简单的占位图片

效果:

 

六、结语

最后,让我们将马赛克滤镜和灰色滤镜应用到实际图片中。通过炫酷的示例,展示图片处理的魅力,让您的前端项目瞬间焕发全新的魅力!

 前端特效必备就在这里!通过Canvas和算法实现马赛克和灰色滤镜,让您的图片变得与众不同!希望本篇博客能够帮助您更好地理解图像处理的魅力,并在前端开发中尝试更多的炫酷特效!继续探索前端图像处理的更多应用场景和技巧,让您的前端项目更上一层楼!🌈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BMapGL -- 生成多个maker,获取指定标识的maker,并清除他们

需求描述: 在使用 Baidu Map JavaScript API 创建多个标记时,可以为每个标记设置一个唯一的标识符(identifier),以便在以后可以根据标识符获取特定的标记,并清除它们。 代码: // 创建地图实例 var map = new BMapGL.Map("container");// 创建标记1 var poin…

与传统透明屏相比,BOE透明屏有哪些特点优势?

BOE透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达90%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业展示、智能家居、汽车行业等&#xff0c;具有广阔的市场前景。 BOE透明屏采用了先进的光学技术&#xff0c;通过控制光的传播和折射&#xff…

python核心-面向对象-python对象的生命周期,以及周期方法

监听对象的生命周期 # -----------------------------几个监听对象生命周期的方法---------------------- # class Person: # # def __new__(cls, *args, **kwargs): # # print("新建一个对象&#xff0c;但是被我拦截了") # def __init__(self): # …

Spring-ApplictionContext

Spring Spring是整个Java体系最核心的框架&#xff0c;没有之一。 核心类图结构 ApplicationContext ApplicationEventPublisher&#xff1a;提供了一种机制&#xff0c;用于通知应用程序中感兴趣的部分有关其执行过程中发生的特定事件。ListableBeanFactory&#xff1a;是S…

vue新学习 02 vue命令v-model,数据代理,事件,监听,渲染

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

【DP】The 2022 ICPC Asia Regionals Online Contest (II) B Non-decreasing Array

PTA | 程序设计类实验辅助教学平台 题意&#xff1a; 给定一个不下降的序列&#xff0c;每次操作有两步&#xff1a; 1.选择2~N的一个数&#xff0c;删除这个数 2.选择2~N的一个数&#xff0c;改变这个数为任意值 要满足该数列不下降&#xff0c;N-2次询问&#xff0c;问操…

《玉骨遥》:腾讯视频定义古偶叙事及格线

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文 | 螳螂观察 作者 | 郭襄 拿着自带话题与流量的古偶仙侠剧《玉骨遥》&#xff0c;腾讯视频着实做了一回暑期档的“显眼包”。 对于长视频平台来说&#xff0c;暑期档是兵家必争之地。但在一众竞争者中&#xff0…

3.操作元素内容

3.1元素innerText属性 ➢将文本内容 添加/更新到任意标签位置 ➢显示纯文本&#xff0c;不解析标签 【例如】 <body><div class"box">文字内容</div><script>// 1.获取元素const box document.querySelector(.box)// 2.修改文字内容 对象…

完全背包--动态规划

一)模板题:完全背包 【模板】完全背包_牛客题霸_牛客网 (nowcoder.com) 第一问: 一)定义一个状态表示: dp[i][j]表示从前i个物品中选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;最大的价值 二)根据状态标识推到状态转移方程:根据最后一个位置的状态来划分问…

配置tomcat内存大小(windows、linux)

一、参数说明 -Xms&#xff1a; JVM初始分配的堆内存 -Xmx&#xff1a; JVM最大允许分配的堆内存&#xff0c;按需分配 -XX:PermSize&#xff1a; JVM初始分配的非堆内存 -XX:MaxPermSize&#xff1a; JVM最…

华为openGauss数据库入门 - gsql用法

目录 1.1 gsql的语法 1.2 gsql常用选项 1.2.1 最常用的必要选项 1.2.2 -r选项 1.2.3 -E选项 1.2.4 -t选项 1.2.5 -A选项 1.2.6 -v选项 1.2.7 -c选项 1.2.8 -f选项 1.2.9 -q选项 1.3 gsql的元命令 1.3.1 \l命令 1.3.2 \du命令和\dg命令 1.3.3 \db命令 1.3.4 \d…

flask部署钉钉机器人和企业微信机器人

引言 创建机器人&#xff0c;目的是通过机器人的方式&#xff0c;提出用户的问题&#xff0c;得到想要的回答 钉钉机器人 首先我们需要获取钉钉的企业内部开发者权限然后我们进入钉钉开放平台,登陆后&#xff0c;选择应用开发->机器人->创建应用&#xff0c;我创建了一…

用HTML写一个简单的静态购物网站

实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>购物网站</title> &l…

如何判断直线导轨的质量?

直线导轨是机械行业中的重要传动零部件&#xff0c;随着科技3.0时代的到来&#xff0c;直线导轨的需求量也在不断的增加&#xff0c;目前市面上直线导轨的品牌有很多&#xff0c;质量也是良莠不济&#xff0c;那么&#xff0c;我们应该怎样才能挑选到质量好的直线导轨呢&#x…

Python - OpenCV实现摄像头人脸识别(亲测版)

要使用Python 3和OpenCV进行摄像头人脸识别&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1.安装OpenCV库 在命令行中输入以下命令&#xff1a; pip install opencv-python2.准备人脸检测器 使用OpenCV的人脸检测器可以检测出图像中的人脸。在Python中&#xff0c;您…

十一章:Weakly-Supervised Semantic Segmentation Network —— 基于深度种子区域增长的弱监督语义分割网络

0.摘要 本文研究了只使用图像级别标签作为监督来学习图像语义分割网络的问题&#xff0c;这是重要的&#xff0c;因为它可以显著减少人工标注的工作量。最近在这个问题上的最新方法首先使用深度分类网络推断出每个对象类的稀疏和有区别的区域&#xff0c;然后使用有区别的区域作…

const int * p,int const *p, int * const p, const int *const p 搞不清楚?

一、废话不多说&#xff0c;直接来结论 变量含义const int *p 指针p可以修改&#xff0c;*p不可修改int const *p 指针p可以修改&#xff0c;*p不可修改int *const p指针p不可以修改&#xff0c;*p可以修改const int * const p指针p不可以修改&#xff0c;*p不可以修改 显…

黑客学习手册(自学网络安全)

一、首先&#xff0c;什么是黑客&#xff1f; 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手&#xff0c;现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术&#xff1f; 其实&#xff0c;网络信息空间安全已经成为海陆空之外的第四大战场&#xff0c;除了国…

MES中的EAP有什么作用?

在现代制造业中&#xff0c;MES&#xff08;Manufacturing Execution System&#xff09;是一个关键的生产管理系统&#xff0c;用于监控、控制和优化制造过程。而EAP&#xff08;Equipment Automation Program&#xff09;作为MES的重要组成部分之一&#xff0c;在生产线上发挥…