Nodejs下使用gm圓形裁剪并合成圖片的示例
說到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的安裝與使用。
GaphicsMagic 安裝
GraphicsMagic 官網(wǎng)是: http://www.graphicsmagick.org/
官網(wǎng)和網(wǎng)上大多數(shù)教程都是教如何編譯,可個人覺得可以直接通過軟件庫安裝,比如
apt-get install graphicsmagic
如果要學(xué)習(xí)用命令行的方式使用GraphicsMagic可以看這里:http://www.dbjr.com.cn/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> <imagestyle="clip-path: url(#clipPath);"href="{{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)驗:
- pattern的x和y設(shè)置為0,0
- pattern的width和height設(shè)置的和 畫布 一樣
- image的x,y設(shè)置為其 “實際位置” ,也就是對應(yīng) circle 的 cx-r 以及 cy-r ,剪 r 是因為cx和cy指的是圓形中心,而x,y是圖形的左上角位置。
代碼實現(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于原生JS實現(xiàn)圖片裁剪
- js+jquery實現(xiàn)圖片裁剪功能
- php+js實現(xiàn)圖片的上傳、裁剪、預(yù)覽、提交示例
- 基于HTML5+JS實現(xiàn)本地圖片裁剪并上傳功能
- Cropper.js 實現(xiàn)裁剪圖片并上傳(PC端)
- 使用ImageMagick進行圖片縮放、合成與裁剪(js+python)
- 使用JavaScript+canvas實現(xiàn)圖片裁剪
- vue-cli結(jié)合Element-ui基于cropper.js封裝vue實現(xiàn)圖片裁剪組件功能
- cropper js基于vue的圖片裁剪上傳功能的實現(xiàn)代碼
- cropperjs實現(xiàn)裁剪圖片功能
相關(guān)文章
nodejs創(chuàng)建簡易web服務(wù)器與文件讀寫的實例
下面小編就為大家?guī)硪黄猲ode js系列課程-創(chuàng)建簡易web服務(wù)器與文件讀寫的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09使用Node.js實現(xiàn)RESTful API的示例
Node.js可以用很少代碼簡單地實現(xiàn)一個Web服務(wù),并且它有一個非常活躍的社區(qū),通過Node出色的包管理機制(NPM)可以非常容易獲得各種擴展支持。 對簡單的應(yīng)用場景Node.js實現(xiàn)REST是一個非常合適的選擇。 本文介紹如何用Node.js實現(xiàn)REST服務(wù)。2017-08-08nodejs構(gòu)建本地web測試服務(wù)器 如何解決訪問靜態(tài)資源問題
這篇文章主要為大家詳細介紹了nodejs構(gòu)建本地web測試服務(wù)器,教大家如何解決訪問靜態(tài)資源問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07前端之npm運行時配置文件.npmrc的方法(可用于配置npm淘寶源)
這篇文章主要給大家介紹了關(guān)于前端之npm運行時配置文件.npmrc(可用于配置npm淘寶源)的相關(guān)資料,.npmrc 文件是用于配置 npm(Node.js 包管理器)行為的配置文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07Node.js+jade+mongodb+mongoose實現(xiàn)爬蟲分離入庫與生成靜態(tài)文件的方法
下面小編就為大家?guī)硪黄狽ode.js+jade+mongodb+mongoose實現(xiàn)爬蟲分離入庫與生成靜態(tài)文件的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Node.js使用Express創(chuàng)建Web項目詳細教程
如果需要入門使用node.js進行web開發(fā),正在學(xué)習(xí) nodejs web開發(fā)指南 的和想快速了解node.js web開發(fā)模式的朋友,相信本文是有一定幫助意義的。2017-03-03深入學(xué)習(xí)nodejs中的async模塊的使用方法
本篇文章主要介紹了nodejs中的async模塊的使用方法,具有一定的參考價值,有興趣的可以了解一下2017-07-07