JavaScript实现图像灰度、单色及彩虹滤镜算法详解

作者:页面旅途

时间:2026-10-23

浏览:501

本文详细解析JavaScript中多种图像滤镜的算法实现。通过遍历像素数据,演示了如何将RGB值设为相等以实现灰度效果;计算均值并基于128阈值进行色彩映射以生成红色单色滤镜;以及根据像素坐标与均值组合实现彩虹渐变效果。代码涵盖模糊处理中的随机数生成逻辑,为前端图像编辑提供实用参考。

文章目录

本文主要介绍在JavaScript中实现多种图像滤镜算法的具体代码示例。文中通过详细的代码演示,展示了不同滤镜效果的生成原理与实现方式,对从事前端开发或图像算法研究的人员具有实际的参考价值,建议读者结合示例代码进行深入学习与工作应用。

灰色滤镜实现原理

1. 灰色滤镜

实现灰色滤镜的核心逻辑是设定图像的红色(R)、绿色(G)和蓝色(B)通道值相等。具体做法是计算这三个通道的平均值,并将该平均值同时赋给R、G、B三个通道,从而消除色彩信息,仅保留亮度信息。


function makeGray(img){
 for(var pixel of img.values()){
  var avg = (pixel.getRed()+pixel.getGreen()+pixel.getBlue())/3;
  pixel.setRed(avg);
  pixel.setGreen(avg);
  pixel.setBlue(avg);
 }
 return img;
}

红色单色滤镜算法

2. 单色滤镜(以红色为例)

在生成红色单色滤镜时,首先计算像素R、G、B三个通道值的平均值avg。随后判断该avg值是否小于128。若小于128,则进行暗部色彩映射;若大于等于128,则进行亮部色彩映射,以此实现具有层次感的红色单色效果。


function makeRed(img){
 for(var pixel of img.values()){
  var avg = (pixel.getRed()+pixel.getGreen()+pixel.getBlue())/3;
  if(avg<128){
   pixel.setRed(2*avg);
   pixel.setGreen(0);
   pixel.setBlue(0);
  }
  else{
   pixel.setRed(255);
   pixel.setGreen(2*avg-255);
   pixel.setBlue(2*avg-255);
  }
 }
 return img;
}

彩色与模糊滤镜处理

3. 彩色滤镜


function makeRainbow(img){
 for(var pixel of img.values()){
  var x = pixel.getX();
  var y = pixel.getY();
  var avg = (pixel.getRed()+pixel.getGreen()+pixel.getBlue())/3;
  var h = img.height;
  if(y<h/7){
   if(avg<128){
    pixel.setRed(2*avg);
    pixel.setGreen(0);
    pixel.setBlue(0);
   }
   else{
    pixel.setRed(255);
    pixel.setGreen(2*avg-255);
    pixel.setBlue(2*avg-255);
   }
  }
  if(y>=h/7 && y<h*2/7){
   if(avg<128){
    pixel.setRed(2*avg);
    pixel.setGreen(0.8*avg);
    pixel.setBlue(0);
   }
   else{
    pixel.setRed(255);
    pixel.setGreen(1.2*avg-51);
    pixel.setBlue(2*avg-255);
   }
  }
  if(y>=h*2/7 && y<h*3/7){
   if(avg<128){
    pixel.setRed(2*avg);
    pixel.setGreen(2*avg);
    pixel.setBlue(0);
   }
   else{
    pixel.setRed(255);
    pixel.setGreen(255);
    pixel.setBlue(2*avg-255);
   }
  }
  if(y>=h*3/7 && y<h*4/7){
   if(avg<128){
    pixel.setRed(0);
    pixel.setGreen(2*avg);
    pixel.setBlue(0);
   }
   else{
    pixel.setRed(2*avg-255);
    pixel.setGreen(255);
    pixel.setBlue(2*avg-255);
   }
  }
  if(y>=h*4/7 && y<h*5/7){
   if(avg<128){
    pixel.setRed(0);
    pixel.setGreen(0);
    pixel.setBlue(2*avg);
   }
   else{
    pixel.setRed(2*avg-255);
    pixel.setGreen(2*avg-255);
    pixel.setBlue(255);
   }
  }
  if(y>=5*h/7 && y<h*6/7){
   if(avg<128){
    pixel.setRed(0.8*avg);
    pixel.setGreen(0);
    pixel.setBlue(2*avg);
   }
   else{
    pixel.setRed(1.2*avg-51);
    pixel.setGreen(2*avg-255);
    pixel.setBlue(255);
   }
  }
  if(y>=h*6/7){
   if(avg<128){
    pixel.setRed(1.6*avg);
    pixel.setGreen(0);
    pixel.setBlue(1.6*avg);
   }
   else{
    pixel.setRed(0.4*avg+153);
    pixel.setGreen(2*avg-255);
    pixel.setBlue(0.4*avg+153);
   }
  }
 }
 return img;
}

4. 模糊滤镜

在实现模糊滤镜的过程中,需要生成介于0到1之间的随机数。这一随机数通常用于模拟噪声或作为卷积核计算的权重因子,以破坏像素间的严格对应关系,从而产生视觉上的模糊效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章