gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

淺析利用nodejs怎么給圖片添加半透明水印(方法詳解)

怎么利用nodejs給圖片添加水印?下面本篇文章通過示例來介紹一下使用node為圖片添加全頁(yè)面半透明水印的方法,希望對(duì)大家有所幫助!

淺析利用nodejs怎么給圖片添加半透明水印(方法詳解)

作為中后臺(tái)項(xiàng)目的導(dǎo)出功能,通常會(huì)被要求具備導(dǎo)出的追溯能力。

當(dāng)導(dǎo)出的數(shù)據(jù)形態(tài)為圖片時(shí),一般會(huì)為圖片添加水印以達(dá)到此目的。

DEMO

那么在導(dǎo)出圖片前如何為其添加上可以作為導(dǎo)出者身份識(shí)別的水印呢?先看成品:

淺析利用nodejs怎么給圖片添加半透明水印(方法詳解)

上圖原圖為我隨便在網(wǎng)上找的一張圖片,添加水印之后的效果如圖所示。

業(yè)務(wù)需求分解

這里我們需要考慮在此業(yè)務(wù)場(chǎng)景之下,這個(gè)需求的三個(gè)要點(diǎn):

  • 水印需要鋪滿整個(gè)圖片
  • 水印文字成半透明狀,保證原圖的可讀性
  • 水印文字應(yīng)清晰可讀

選型

如我一樣負(fù)責(zé)在一個(gè)node.js server上實(shí)現(xiàn)以上需求,可選項(xiàng)相當(dāng)多,比如直接使用c lib imagemagick或者已有人封裝的各種node watermarking庫(kù)。在本文中,我們將選擇使用對(duì)Jimp庫(kù)的封裝。

Jimp 庫(kù)的官方github頁(yè)面上這樣描述它自己:

An image processing library for Node written entirely in JavaScript, with zero native dependencies.

并且提供為數(shù)眾多的操作圖片的API

  • blit – Blit an image onto another.
  • blur – Quickly blur an image.
  • color – Various color manipulation methods.
  • contain – Contain an image within a height and width.
  • cover – Scale the image so the given width and height keeping the aspect ratio.
  • displace – Displaces the image based on a displacement map
  • dither – Apply a dither effect to an image.
  • flip – Flip an image along it's x or y axis.
  • gaussian – Hardcore blur.
  • invert – Invert an images colors
  • mask – Mask one image with another.
  • normalize – Normalize the colors in an image
  • print – Print text onto an image
  • resize – Resize an image.
  • rotate – Rotate an image.
  • scale – Uniformly scales the image by a factor.

在本文所述的業(yè)務(wù)場(chǎng)景中,我們只需使用其中部分API即可。

設(shè)計(jì)和實(shí)現(xiàn)

input 參數(shù)設(shè)計(jì):

  • url: 原圖片的存儲(chǔ)地址(對(duì)于Jimp來說,可以是遠(yuǎn)程地址,也可以是本地地址)
  • textSize: 需添加的水印文字大小
  • opacity:透明度
  • text:需要添加的水印文字
  • dstPath:添加水印之后的輸出圖片地址,地址為腳本執(zhí)行目錄的相對(duì)路徑
  • rotate:水印文字的旋轉(zhuǎn)角度
  • colWidth:因?yàn)榭尚D(zhuǎn)的水印文字是作為一張圖片覆蓋到原圖上的,因此這里定義一下水印圖片的寬度,默認(rèn)為300像素
  • rowHeight:理由同上,水印圖片的高度,默認(rèn)為50像素。(PS:這里的水印圖片尺寸可以大致理解為水印文字的間隔)

因此在該模塊的coverTextWatermark函數(shù)中對(duì)外暴露以上參數(shù)即可

coverTextWatermark

/**  * @param {String} mainImage - Path of the image to be watermarked  * @param {Object} options  * @param {String} options.text     - String to be watermarked  * @param {Number} options.textSize - Text size ranging from 1 to 8  * @param {String} options.dstPath  - Destination path where image is to be exported  * @param {Number} options.rotate   - Text rotate ranging from 1 to 360  * @param {Number} options.colWidth - Text watermark column width  * @param {Number} options.rowHeight- Text watermark row height  */  module.exports.coverTextWatermark = async (mainImage, options) => {   try {     options = checkOptions(options);     const main = await Jimp.read(mainImage);     const watermark = await textWatermark(options.text, options);     const positionList = calculatePositionList(main, watermark)     for (let i =0; i < positionList.length; i++) {       const coords = positionList[i]       main.composite(watermark,         coords[0], coords[1] );     }     main.quality(100).write(options.dstPath);     return {       destinationPath: options.dstPath,       imageHeight: main.getHeight(),       imageWidth: main.getWidth(),     };   } catch (err) {     throw err;   } }

textWatermark

Jimp不能直接將文本旋轉(zhuǎn)一定角度,并寫到原圖片上,因此我們需要根據(jù)水印文本生成新的圖片二進(jìn)制流,并將其旋轉(zhuǎn)。最終以這個(gè)新生成的圖片作為真正的水印添加到原圖片上。下面是生成水印圖片的函數(shù)定義:

const textWatermark = async (text, options) => {   const image = await new Jimp(options.colWidth, options.rowHeight, '#FFFFFF00');   const font = await Jimp.loadFont(SizeEnum[options.textSize])   image.print(font, 10, 0, {     text,     alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,     alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE   },   400,   50)   image.opacity(options.opacity);   image.scale(3)   image.rotate( options.rotation )   image.scale(0.3)   return image }

calculatePositionList

到目前為止原圖有了,水印圖片也有了,如果想達(dá)到鋪滿原圖的水印效果,我們還需要計(jì)算出水印圖片應(yīng)該在哪些坐標(biāo)上畫在原圖上,才能達(dá)成水印鋪滿原圖的目的。

const calculatePositionList = (mainImage, watermarkImg) => {   const width = mainImage.getWidth()   const height = mainImage.getHeight()   const stepWidth = watermarkImg.getWidth()   const stepHeight = watermarkImg.getHeight()   let ret = []   for(let i=0; i < width; i=i+stepWidth) {     for (let j = 0; j < height; j=j+stepHeight) {       ret.push([i, j])     }   }   return ret }

如上代碼所示,我們使用一個(gè)二維數(shù)組記錄所有水印圖片需出現(xiàn)在原圖上的坐標(biāo)列表。

總結(jié)

至此,關(guān)于使用Jimp為圖片添加文字水印的所有主要功能就都講解到了。

github地址:https://github.com/swearer23/jimp-fullpage-watermark

npm:npm i jimp-fullpage-watermark

Inspiration 致謝

https://github.com/sushantpaudel/jimp-watermark

https://github.com/luthraG/image-watermark

https://medium.com/@rossbulat/image-processing-in-nodejs-with-jimp-174f39336153

示例代碼:

var watermark = require('jimp-fullpage-watermark');  watermark.coverTextWatermark('./img/main.jpg', {   textSize: 5,   opacity: 0.5,   rotation: 45,   text: 'watermark test',   colWidth: 300,   rowHeight: 50 }).then(data => {     console.log(data); }).catch(err => {     console.log(err); });

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日韩成人三级视频| av在线播放天堂| 男人操女人免费软件| 欧美性视频在线播放| 日本熟妇人妻xxxxx| 菠萝蜜视频在线观看入口| 日韩欧美国产片| 久久人妻精品白浆国产| 欧美日韩黄色一级片| av网站大全免费| 成人国产在线看| 激情成人在线观看| 国产精品igao网网址不卡| 欧美污视频网站| 欧美 日韩 国产在线观看| 久草视频国产在线| 久在线观看视频| 欧美色图另类小说| 欧美xxxxx在线视频| 成人一级片网站| 免费黄色特级片| 中文字幕视频在线免费观看| 丝袜老师办公室里做好紧好爽 | 18禁裸男晨勃露j毛免费观看| 亚洲综合在线一区二区| 久久人人爽人人片| 色婷婷一区二区三区在线观看| 看看黄色一级片| 黄色污污在线观看| 国产91视频一区| av7777777| 性chinese极品按摩| 超碰中文字幕在线观看| 无码毛片aaa在线| 日日碰狠狠添天天爽超碰97| 人妻有码中文字幕| 国产一区二区在线免费播放| 欧美成人三级在线播放| 中文字幕一区二区三区四区五区人| 日韩精品aaa| 国产在线观看欧美| 青青青在线播放| 五月天激情播播| 青青在线免费观看| 亚洲一区二区蜜桃| 做爰高潮hd色即是空| av女优在线播放| 天天综合网日韩| 岛国大片在线播放| 嫩草视频免费在线观看| 亚洲中文字幕无码一区二区三区| 国产精品又粗又长| 亚洲一级片网站| 欧美人成在线观看| 亚洲国产成人va在线观看麻豆| 4444在线观看| 亚洲免费999| 男女啪啪免费视频网站| 日本美女视频一区| 免费欧美一级视频| 国产成人亚洲精品无码h在线| 一区二区三区四区毛片| 欧美日韩精品在线一区二区| 天天综合成人网| 色哟哟精品视频| 久草青青在线观看| 大西瓜av在线| 亚洲第一综合网站| 亚洲天堂av线| 日韩欧美在线播放视频| 成人污网站在线观看| 日韩视频在线观看一区二区三区| 青青草原成人网| 91网站在线观看免费| 亚洲精品在线视频播放| 国产理论在线播放| 国模吧无码一区二区三区| 嫩草影院中文字幕| 久久视频免费在线| 偷拍盗摄高潮叫床对白清晰| 91激情视频在线| 亚洲综合在线网站| 国产天堂在线播放| 99久久国产宗和精品1上映| 欧美色图色综合| 波多野结衣家庭教师在线播放| 喜爱夜蒲2在线| 国产精品三级一区二区| 狠狠干视频网站| 国产亚洲精品久久久久久久| a级网站在线观看| 色爽爽爽爽爽爽爽爽| 午夜激情影院在线观看| 亚洲视频在线不卡| 四虎精品欧美一区二区免费| 国产一区一区三区| www.xxx麻豆| 国产96在线 | 亚洲| 亚洲人精品午夜射精日韩| 尤物av无码色av无码| wwwxxx黄色片| 国产九九热视频| 欧美性猛交xxxx乱大交91| 免费不卡av网站| 国产精品va在线观看无码| 久久久久久久中文| 黄色片在线免费| 日本特黄在线观看| 男的插女的下面视频| 干日本少妇首页| 午夜久久福利视频| 黄色一级片国产| 一级黄色高清视频| 久久久99精品视频| 亚洲人成色77777| 国产不卡的av| 国产xxxxx在线观看| 天天综合网日韩| 屁屁影院ccyy国产第一页| 青青在线视频免费| 黄色一级视频播放| 成人免费xxxxx在线视频| 国产高清999| 免费日韩中文字幕| 97超碰人人爱| 色综合天天色综合| 久草视频这里只有精品| 国产熟人av一二三区| 屁屁影院ccyy国产第一页| 性刺激的欧美三级视频| 国产www免费| 国产91av视频在线观看| 成人在线免费观看av| wwwjizzjizzcom| 手机看片一级片| 成人久久久久久久久| 日本香蕉视频在线观看| 亚洲天堂网站在线| 一级片视频免费观看| 精品人妻一区二区三区四区在线 | 精品免费国产一区二区| 国产又粗又猛大又黄又爽| 国产欧美高清在线| 婷婷无套内射影院| 日韩成人三级视频| 久久视频免费在线| 最近中文字幕免费mv| 中日韩av在线播放| 最近中文字幕一区二区| 人妻无码视频一区二区三区| 波多野结衣家庭教师在线| 国产视频在线观看网站| 69精品丰满人妻无码视频a片| 两性午夜免费视频| 国产资源中文字幕| 永久免费在线看片视频| 在线无限看免费粉色视频| 吴梦梦av在线| 四虎永久免费网站| www国产无套内射com| 亚洲小说欧美另类激情| 韩国黄色一级大片| 9191国产视频| 日本在线xxx| 久久久久久久激情| 男人插女人下面免费视频| 男人插女人下面免费视频| www.com黄色片| 在线观看日本www| 免费观看黄色的网站| 成人在线免费观看视频网站| 欧美激情成人网| 亚洲怡红院在线| 男同互操gay射视频在线看| 国产成人三级视频| 欧美 国产 综合| 波多野结衣天堂| 久久久久久久久久久久久久久国产| 成年网站免费在线观看| 久久出品必属精品| 黄色一级片在线看| 欧美自拍小视频| 天堂av在线中文| av免费观看网| 亚洲黄色av片| 五十路熟女丰满大屁股| 妺妺窝人体色www在线观看| 一级做a免费视频| 欧美大黑帍在线播放| 成人免费观看毛片| 三年中文高清在线观看第6集 | 亚洲中文字幕无码一区二区三区| 免费网站永久免费观看| 精品人妻少妇一区二区| 天天操,天天操| 国产www免费| 欧美精品 - 色网| 激情伊人五月天| 夜夜夜夜夜夜操| 六月丁香婷婷在线|