最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用Node.js判斷png圖片是否存在透明像素

 更新時間:2021年08月02日 15:36:05   作者:HJ5  
這篇文章主要給大家介紹了關(guān)于如何使用Node.js判斷png圖片是否存在透明像素的相關(guān)資料,文中將實現(xiàn)的原理以及代碼介紹的非常詳細,需要的朋友可以參考下

背景

png格式的圖片存儲空間會比jpg格式的圖片大,但是png圖片的質(zhì)量明顯更好。有時候并不需要圖片的質(zhì)量非常的好,但是為了減少包體,需要做一些優(yōu)化,比如壓縮圖片,把沒有帶透明像素的png圖片轉(zhuǎn)化成jpg格式的圖片。這片文章主要來講講怎么利用Node.js來檢測沒有帶透明像素的png圖片,以及如何把它轉(zhuǎn)化成jpg圖片。

代碼

直接上代碼

import canvas from 'canvas';
import fs from 'fs';

/**
 * 判斷png圖片是否存在透明像素
 *
 * @param {*} pngPath png圖片路徑
 * @param {number} [limit=255] 透明像素點限度,默認小與255視為透明像素
 * @param {boolean} [isToJpg=false] 如果沒有透明像素是否轉(zhuǎn)化為jpg圖片
 * @returns
 */
function hasOpacity(pngPath, limit = 255, isToJpg = false) {
  // 獲取圖片的buffer
  const buffer = fs.readFileSync(pngPath);

  // 圖片的寬度存在buffer的第17到20個字節(jié)
  const width = buffer.readUInt32BE(16);
  // 圖片的寬度存在buffer的第21到24個字節(jié)
  const height = buffer.readUInt32BE(20);

  // 創(chuàng)建一個畫布
  const pngCanvas = canvas.createCanvas(width, height);
  // 拿到畫筆
  const context = pngCanvas.getContext('2d');
  // 創(chuàng)建一張圖片
  const img = new canvas.Image();
  // 記載圖片
  img.src = buffer;
  // 使用畫筆把圖片畫在畫布上
  context.drawImage(img, 0, 0, width, height);

  // 獲取png圖片的數(shù)據(jù)的像素數(shù)據(jù)
  let res = context.getImageData(0, 0, width, height);
  let imgData = res.data;
  // 每個像素占用4個字節(jié),計算出一共有多少像素
  // [r, g, b, a]
  let piexCount = imgData.length / 4;

  // 是否已經(jīng)找到透明像素
  let isOpacity = false;

  for (let i = 0; i < piexCount; i++) {
    // 遍歷每個像素點,找透明通道
    let opacity = imgData[i * 4 + 3];
    if (opacity < limit) {
        // 如果小于limit,則存在透明像素,退出
      isOpacity = true;
      break;
    }
  }

  // 如果不存在透明像素且isToJpg為true,則轉(zhuǎn)化為jpg格式的圖拍呢
  if (!isOpacity && isToJpg) {
    const out = fs.createWriteStream(pngPath.split('.')[0] + '.jpg');
    pngCanvas.createJPEGStream().pipe(out);
    out.on('finish', () => console.log(pngPath, '轉(zhuǎn)成jpg成功'));
  }

  // 返回
  return isOpacity;
}

console.log(hasOpacity('hh.png', 254, true));
console.log(hasOpacity('jj.png'));

原理:

canvas采用四個字節(jié)存放像素,[r, g, b, a],分別代表紅色通道,綠色通道,藍色通道,透明通道。每個字節(jié)是8位,所以每個通道的數(shù)據(jù)是0~255之間,就透明通道而言,255表示完全不透明,0表示完全透明。我們利用Node.js的buffer和canvas把png圖片轉(zhuǎn)化成一個個像素點的數(shù)據(jù),然后通過遍歷每個透明通道,就可以找到png圖片是否帶有透明像素。

疑問?為什么有個limit參數(shù)?

這是因為在實際應用中,有可能存在少量254、253的透明通過,這些看起來就跟完全不透明的像素一樣,所以把他們也當作不是透明像素處理。這個根據(jù)自己能夠接受的限度去傳參。

實例圖片

帶透明像素

不帶透明像素

canvas

關(guān)于canvas的更多使用,請參考 www.npmjs.com/package/can

總結(jié)

到此這篇關(guān)于如何使用Node.js判斷png圖片是否存在透明像素的文章就介紹到這了,更多相關(guān)Node.js判斷png圖片透明像素內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • node.js [superAgent] 請求使用示例

    node.js [superAgent] 請求使用示例

    這篇文章主要介紹了node.js [superAgent] 請求使用示例,分別給大家匯總了post請求、get請求、delete請求和put請求的示例,推薦給大家,希望大家能夠喜歡。
    2015-03-03
  • 修改Nodejs內(nèi)置的npm默認配置路徑方法

    修改Nodejs內(nèi)置的npm默認配置路徑方法

    今天小編就為大家分享一篇修改Nodejs內(nèi)置的npm默認配置路徑方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js如何提取文件中的中文字符

    Node.js如何提取文件中的中文字符

    這篇文章主要介紹了Node.js如何提取文件中的中文字符,本文介紹了在Node.js開發(fā)中如何使用代碼提取文件中的中文字符,幫助開發(fā)者更好地處理中文文本數(shù)據(jù),提高開發(fā)效率
    2023-05-05
  • NodeJS創(chuàng)建基礎(chǔ)應用并應用模板引擎

    NodeJS創(chuàng)建基礎(chǔ)應用并應用模板引擎

    這篇文章主要介紹了NodeJS創(chuàng)建基礎(chǔ)應用并應用模板引擎的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • Node.js中使用計時器定時執(zhí)行函數(shù)詳解

    Node.js中使用計時器定時執(zhí)行函數(shù)詳解

    這篇文章主要介紹了Node.js中使用計時器定時執(zhí)行函數(shù)詳解,本文使用了Node.js中的setTimeout和setInterval函數(shù),需要的朋友可以參考下
    2014-08-08
  • 詳解nodejs 文本操作模塊-fs模塊(四)

    詳解nodejs 文本操作模塊-fs模塊(四)

    本篇文章詳細的講訴fa.fstat方法,這個State對象中,包含的數(shù)據(jù)都有哪些,并且他們分別代表的含義是什么。具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • 淺談Node.js:fs文件系統(tǒng)模塊

    淺談Node.js:fs文件系統(tǒng)模塊

    本篇文章主要介紹了Node.js:fs文件系統(tǒng)模塊,具有一定的參考價值,有需要的可以了解一下。
    2016-12-12
  • nodejs之base64編碼解碼問題

    nodejs之base64編碼解碼問題

    這篇文章主要介紹了nodejs之base64編碼解碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Node.js實現(xiàn)簡單管理系統(tǒng)

    Node.js實現(xiàn)簡單管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Node.js實現(xiàn)簡單管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • node.js如何自定義實現(xiàn)一個EventEmitter

    node.js如何自定義實現(xiàn)一個EventEmitter

    我們了解到,Node采用了事件驅(qū)動機制,而EventEmitter就是Node實現(xiàn)事件驅(qū)動的基礎(chǔ),本文主要介紹了node.js自定義實現(xiàn)EventEmitter,感興趣的可以了解一下
    2021-07-07

最新評論

洛隆县| 兴业县| 疏附县| 黎平县| 龙泉市| 平安县| 泰州市| 重庆市| 萍乡市| 北碚区| 富宁县| 临夏市| 绍兴县| 微山县| 德安县| 虞城县| 潍坊市| 安义县| 墨玉县| 谢通门县| 花莲县| 资兴市| 鱼台县| 木兰县| 东光县| 澜沧| 安宁市| 昭觉县| 沁源县| 留坝县| 凤凰县| 曲阜市| 苍溪县| 诏安县| 女性| 永和县| 开远市| 张家口市| 白朗县| 沁阳市| 包头市|