JS实现彩色图片转换为黑白图片的3种方法

 更新时间:2024年09月10日 10:46:46   作者:代码里的小猫咪  
本文主要介绍了JS实现彩色图片转换为黑白图片的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 使用 Canvas

研究 canvas 时发现一个有趣的现象——将彩色图片巧妙地转换为黑白图片。以下是实现这一功能的简洁代码示例:

<div style="display: flex">
  <img src="./panda.jpeg" />
  <button onclick="change()">转换</button>
  <canvas width="358" height="362"></canvas>
</div>

大致步骤为:

1. 把 img 元素画到 canvas 上

2. 获取画布某个区域的图像信息,返回图片信息对象

包括 data-类型化数组(红,绿,蓝,alpha),图片的宽高等数据

3. 重新设置图像数据到画布

<script>
  function change() {
    const img = document.querySelector("img");
    const cvs = document.querySelector("canvas");
    // 获取绘图表面提供 2D 渲染上下文
    const ctx = cvs.getContext("2d");
    // 把img元素画到canvas画布上
    ctx.drawImage(img, 0, 0);

    // 获取画布某个区域的图像信息(整个图片区域)
    const imageData = ctx.getImageData(0, 0, img.width, img.height);
    // imageData:图片信息对象
    for (let i = 0; i < imageData.data.length; i += 4) {
      // 将灰度值重新赋值给rgba
      const r = imageData.data[i];
      const g = imageData.data[i + 1];
      const b = imageData.data[i + 2];
      const avg = (r + g + b) / 3;
      imageData.data[i] =
      imageData.data[i + 1] =
      imageData.data[i + 2] =
      avg;
    }
    // 重新设置图像数据到画布
    ctx.putImageData(imageData, 0, 0);
  }
  </script>

实现的效果如下:

注意:需要将 canvas 的 width 和 height 设置成图片的真实大小,否则可能出现转换后图片尺寸不一致。

黑白图片的原理

1. 画布中的一个图像是由多个像素点组成,每个像素点有四个数据:红、绿、蓝、alpha。

2. 将图像变成黑白,只需要将图像的每一个像素点设置成当前红、绿、蓝值的平均数即可。

2. 使用 CSS 滤镜

如果只是希望在页面上显示灰度图片,而不需要在 JavaScript 中处理图片数据,那么可以直接使用 CSS 的 filter 属性来实现。代码如下:

<div>
  <img src="./panda.jpeg" />
  <button onclick="change()">点击</button>
</div>
<script>
  const change = () => {
    const img = document.querySelector('img');
    img.style.filter = 'grayscale(100%)'
  }
</script>

这种方法不会改变图片的原始数据,只是改变了其在页面上的显示方式。

效果如下:

3. 使用第三方库

比如 Three.js 或 Pixi.js,这些库提供了自己的方法来处理图像数据,包括灰度化。如果需要更加精准的转换操作,可以参考其官方文档。

到此这篇关于JS实现彩色图片转换为黑白图片的3种方法的文章就介绍到这了,更多相关JS 彩色图片转换黑白图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript拆分字符串时产生空字符的解决方案

    JavaScript拆分字符串时产生空字符的解决方案

    使用JavaScript的split方法拆分字符串时出现一些空字符串"",尤其是当使用正则表达式作为分隔符的时候。那么,产生这些空字符串的原因是什么?又该如何来处理呢,这就是今天我们要探讨的问题
    2014-09-09
  • 详细谈谈JS中的内存与变量存储

    详细谈谈JS中的内存与变量存储

    js中的变量在内存中的具体存储形式是我们学习使用JS必会的,下面这篇文章主要给大家介绍了关于JS中内存与变量存储的相关资料,需要的朋友可以参考下
    2021-08-08
  • JS的for循环中的var 和 let详解

    JS的for循环中的var 和 let详解

    在js的嵌套for循环异步执行,声明i和使用i获取到的变量 都要用 let 声明,不要用var,这篇文章主要介绍了JS的for循环中的var和let,需要的朋友可以参考下
    2024-05-05
  • JavaScript读写二进制数据的方法详解

    JavaScript读写二进制数据的方法详解

    avascript里有两个内置对象,一个是ArrayBuffer;一个是DataView,读写二进制数据都需要使用这两个对象。这篇文章主要给大家介绍了关于JavaScript读写二进制数据的方法,需要的朋友可以参考下
    2018-09-09
  • JavaScript实现简单省市联动

    JavaScript实现简单省市联动

    这篇文章主要为大家详细介绍了JavaScript实现简单省市联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • JavaScript实现像素鸟小游戏的详细流程

    JavaScript实现像素鸟小游戏的详细流程

    最近通过javascript这门语言,然后结合html的来写一个简单的小游戏 ,这篇文章主要给大家介绍了关于JavaScript实现像素鸟小游戏的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 微信小程序开发(二)图片上传+服务端接收详解

    微信小程序开发(二)图片上传+服务端接收详解

    本篇文章主要介绍了微信小程序开发(二)图片上传+服务端接收,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • js/jquery获取文本框输入焦点的方法

    js/jquery获取文本框输入焦点的方法

    本篇文章主要是对js/jquery获取文本框输入焦点的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-03-03
  • 微信小程序动态添加view组件的实例代码

    微信小程序动态添加view组件的实例代码

    本文通过实例代码给大家介绍了微信小程序动态添加view组件的方法,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • requestAnimationFrame用法优化源码解析

    requestAnimationFrame用法优化源码解析

    这篇文章主要介绍了requestAnimationFrame用法优化源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论