JS實(shí)現(xiàn)彩色圖片轉(zhuǎn)換為黑白圖片的3種方法
1. 使用 Canvas
研究 canvas 時(shí)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象——將彩色圖片巧妙地轉(zhuǎn)換為黑白圖片。以下是實(shí)現(xiàn)這一功能的簡(jiǎn)潔代碼示例:
<div style="display: flex"> <img src="./panda.jpeg" /> <button onclick="change()">轉(zhuǎn)換</button> <canvas width="358" height="362"></canvas> </div>
大致步驟為:
1. 把 img 元素畫(huà)到 canvas 上
2. 獲取畫(huà)布某個(gè)區(qū)域的圖像信息,返回圖片信息對(duì)象
包括 data-類型化數(shù)組(紅,綠,藍(lán),alpha),圖片的寬高等數(shù)據(jù)

3. 重新設(shè)置圖像數(shù)據(jù)到畫(huà)布
<script>
function change() {
const img = document.querySelector("img");
const cvs = document.querySelector("canvas");
// 獲取繪圖表面提供 2D 渲染上下文
const ctx = cvs.getContext("2d");
// 把img元素畫(huà)到canvas畫(huà)布上
ctx.drawImage(img, 0, 0);
// 獲取畫(huà)布某個(gè)區(qū)域的圖像信息(整個(gè)圖片區(qū)域)
const imageData = ctx.getImageData(0, 0, img.width, img.height);
// imageData:圖片信息對(duì)象
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;
}
// 重新設(shè)置圖像數(shù)據(jù)到畫(huà)布
ctx.putImageData(imageData, 0, 0);
}
</script>實(shí)現(xiàn)的效果如下:

注意:需要將 canvas 的 width 和 height 設(shè)置成圖片的真實(shí)大小,否則可能出現(xiàn)轉(zhuǎn)換后圖片尺寸不一致。

黑白圖片的原理
1. 畫(huà)布中的一個(gè)圖像是由多個(gè)像素點(diǎn)組成,每個(gè)像素點(diǎn)有四個(gè)數(shù)據(jù):紅、綠、藍(lán)、alpha。

2. 將圖像變成黑白,只需要將圖像的每一個(gè)像素點(diǎn)設(shè)置成當(dāng)前紅、綠、藍(lán)值的平均數(shù)即可。

2. 使用 CSS 濾鏡
如果只是希望在頁(yè)面上顯示灰度圖片,而不需要在 JavaScript 中處理圖片數(shù)據(jù),那么可以直接使用 CSS 的 filter 屬性來(lái)實(shí)現(xiàn)。代碼如下:
<div>
<img src="./panda.jpeg" />
<button onclick="change()">點(diǎn)擊</button>
</div>
<script>
const change = () => {
const img = document.querySelector('img');
img.style.filter = 'grayscale(100%)'
}
</script>這種方法不會(huì)改變圖片的原始數(shù)據(jù),只是改變了其在頁(yè)面上的顯示方式。
效果如下:

3. 使用第三方庫(kù)
比如 Three.js 或 Pixi.js,這些庫(kù)提供了自己的方法來(lái)處理圖像數(shù)據(jù),包括灰度化。如果需要更加精準(zhǔn)的轉(zhuǎn)換操作,可以參考其官方文檔。
到此這篇關(guān)于JS實(shí)現(xiàn)彩色圖片轉(zhuǎn)換為黑白圖片的3種方法的文章就介紹到這了,更多相關(guān)JS 彩色圖片轉(zhuǎn)換黑白圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于JS實(shí)現(xiàn)密碼框(password)中顯示文字提示功能代碼
這篇文章主要介紹了實(shí)現(xiàn)密碼框(password)中顯示文字提示功能代碼,在項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到,需要的朋友可以參考下2016-05-05
innerHTML 和 getElementsByName 在IE下面的bug 的解決
innerHTML 真的一個(gè)麻煩的東西。IE 和 firefox 對(duì)dom 處理的方式不是很一樣。IE 對(duì)動(dòng)態(tài)加載的很多dom 不支持動(dòng)態(tài)更新。2010-04-04
jfreechart插件將數(shù)據(jù)展示成餅狀圖、柱狀圖和折線圖
閑暇之余,學(xué)習(xí)了一下jfreechart圖表生成,結(jié)合大蝦們的著作,小弟進(jìn)行了系統(tǒng)的總結(jié),真是獲益匪淺,這里推薦給小伙伴們,有需要的朋友可以參考下。2015-04-04
JavaScript實(shí)現(xiàn)讀取上傳視頻文件的時(shí)長(zhǎng)和第一幀畫(huà)面過(guò)程講解
當(dāng)我們做一個(gè)后臺(tái)系統(tǒng)的音視頻管理模塊時(shí),通常要限制文件的大小和類型,這篇文章主要介紹了JavaScript實(shí)現(xiàn)讀取上傳視頻文件的時(shí)長(zhǎng)和第一幀畫(huà)面過(guò)程,需要詳細(xì)了解實(shí)現(xiàn)方法可以參考下文2023-05-05

