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 元素畫到 canvas 上
2. 獲取畫布某個(gè)區(qū)域的圖像信息,返回圖片信息對(duì)象
包括 data-類型化數(shù)組(紅,綠,藍(lán),alpha),圖片的寬高等數(shù)據(jù)
3. 重新設(shè)置圖像數(shù)據(jù)到畫布
<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); // 獲取畫布某個(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ù)到畫布 ctx.putImageData(imageData, 0, 0); } </script>
實(shí)現(xiàn)的效果如下:
注意:需要將 canvas 的 width 和 height 設(shè)置成圖片的真實(shí)大小,否則可能出現(xiàn)轉(zhuǎn)換后圖片尺寸不一致。
黑白圖片的原理
1. 畫布中的一個(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 濾鏡
如果只是希望在頁面上顯示灰度圖片,而不需要在 JavaScript 中處理圖片數(shù)據(jù),那么可以直接使用 CSS 的 filter 屬性來實(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ù),只是改變了其在頁面上的顯示方式。
效果如下:
3. 使用第三方庫
比如 Three.js 或 Pixi.js,這些庫提供了自己的方法來處理圖像數(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)目開發(fā)中經(jīng)常會(huì)用到,需要的朋友可以參考下2016-05-05innerHTML 和 getElementsByName 在IE下面的bug 的解決
innerHTML 真的一個(gè)麻煩的東西。IE 和 firefox 對(duì)dom 處理的方式不是很一樣。IE 對(duì)動(dòng)態(tài)加載的很多dom 不支持動(dòng)態(tài)更新。2010-04-04jfreechart插件將數(shù)據(jù)展示成餅狀圖、柱狀圖和折線圖
閑暇之余,學(xué)習(xí)了一下jfreechart圖表生成,結(jié)合大蝦們的著作,小弟進(jìn)行了系統(tǒng)的總結(jié),真是獲益匪淺,這里推薦給小伙伴們,有需要的朋友可以參考下。2015-04-04JavaScript實(shí)現(xiàn)讀取上傳視頻文件的時(shí)長(zhǎng)和第一幀畫面過程講解
當(dāng)我們做一個(gè)后臺(tái)系統(tǒng)的音視頻管理模塊時(shí),通常要限制文件的大小和類型,這篇文章主要介紹了JavaScript實(shí)現(xiàn)讀取上傳視頻文件的時(shí)長(zhǎng)和第一幀畫面過程,需要詳細(xì)了解實(shí)現(xiàn)方法可以參考下文2023-05-05