說到Nodejs下的圖片處理可能第一想到就是gm,gm底層可以是GraphicsMagic(其實也是gm的由來),也可以是ImageMagick(其實GraphicsMagic本身也是從ImageMagic分割而來,現(xiàn)在獨立了)。雖然這兩個工具本身都不是js實現(xiàn),所以需要額外安裝,不過此工具非常常見,可能已經(jīng)預(yù)裝在linux系統(tǒng)下,而且安裝也很方便,所以不用因為看到是“第三方”就放棄。雖然說這兩個軟件都只是底層,無需關(guān)心,可筆者在實踐中發(fā)現(xiàn)必須得用GraphicsMagic,所以這里就只介紹GraphicsMagics的安裝與使用。
10年積累的網(wǎng)站制作、做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有明水免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
GaphicsMagic 安裝
GraphicsMagic 官網(wǎng)是: http://www.graphicsmagick.org/
官網(wǎng)和網(wǎng)上大多數(shù)教程都是教如何編譯,可個人覺得可以直接通過軟件庫安裝,比如
apt-get install graphicsmagic
如果要學習用命令行的方式使用GraphicsMagic可以看這里:https://www.jb51.net/LINUXjishu/120332.html
Nodejs下的gm安裝
gm是一個node庫,所以可用npm安裝
npm install gm
官方文檔: http://aheckmann.github.io/gm/
圓形剪裁原理
gm是對GraphicsMagic的封裝,所以理論上GraphicsMagic有的功能都能通過gm以接口的形式實現(xiàn)。gm本身不支持圓形剪裁(至少筆者不知如何實現(xiàn)),同樣意味著其底層也不直接支持。
gm比較常用的功能是:縮放、方形裁剪、格式轉(zhuǎn)換。
所以本教程的圓形裁剪的核心是 借助SVG ,通過svg構(gòu)建一個圓形的圖片,然后通過gm轉(zhuǎn)化為png,即利用svg變換圖片格式。
SVG是可以實現(xiàn)圓形圖片的裁剪的,網(wǎng)上查到有兩種方式實現(xiàn)圓形裁剪
1、通過clip-path
定義一個圓形的路徑,然后在圖片的style中設(shè)置clip-path,也就是通過這個這樣實現(xiàn)圖片裁剪,理論上是真正意義上的“裁剪”
<svg> <defs> <clipPathid="clipPath"> <circlecx="5"cy="5"r="5"/> </clipPath> </defs> <imagehref="{{icon_img}}" rel="external nofollow" rel="external nofollow" x="0"y="0"width="10"height="10"/> </svg>
如果用clip-path可以看這個教程
可是這樣的配置在瀏覽器上看沒有絲毫問題,但是發(fā)現(xiàn)通過gm轉(zhuǎn)化為png后,style沒有任何效果,還是方形的。
2、通過circle標簽
<svg> <defs> <patternpatternUnits="userSpaceOnUse"id="raduisImage"x="0"y="0"width="10"height="10"> <imagehref="{{icon_img}}" rel="external nofollow" rel="external nofollow" x="0"y="0"width="10"height="10"/> </pattern> </defs> <circlecx="5"cy="5"r="5"fill="url(#raduisImage)"></circle> </svg>
先定義一個圖案,也就是原來的圖片,然后創(chuàng)建個圓形,并用剛剛定義的圖案填充在這個圓形里面即可。
合成圖片原理
懂的上述剪裁的原理,合成就變得簡單了。直接把想要合成的圖片以svg的方式拼湊在一起即可。雖然gm本身支持圖片合成,使用compose或者mosaic (詳見這個 教程 )不過感覺不如svg更加明了。
注意筆者嘗試通過svg加上文字,不過發(fā)現(xiàn)中文字無法被識別,所以仍然只能通過gm添加,添加時需要設(shè)置字體(詳見下一章代碼實現(xiàn))
如果要在一個大圖里嵌入兩張圓形的圖片,則需要設(shè)置兩個pattern,這時有個經(jīng)驗:
代碼實現(xiàn)
const gm = require('gm') const fs = require('fs') let templateSVG = "/path/to/original.svg" let outputSVG = "/path/to/repalced.svg" let input = "/path/to/icon.png" let font = "/path/to/font.ttf" let fontColor = "white" let fontSize = 10 fs.readFile(templateSVG,'utf-8',function(err,data){ if (err) throw err var d = data.replace('{{icon_img}}',input) fs.writeFile(outputSVG,d,function(err){ if (err) throw err gm(outputSVG) .font(font) .fill(fontColor) .fontSize(fontSize) .drawText(textPosition[0], textPosition[1], text)// .write(output,function(err){ if(err) cb(err) // next }) }) })
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)站標題:Nodejs下使用gm圓形裁剪并合成圖片的示例
URL鏈接:http://chinadenli.net/article40/jiicho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、靜態(tài)網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站維護、商城網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)