在Nodejs下使用gm裁切在合成圖片
本篇文章主要介紹了Nodejs下使用gm圓形裁剪並合成圖片的範例,現在分享給大家,也給大家做個參考。
說到Nodejs下的圖片處理可能第一想到就是gm,gm底層可以是GraphicsMagic(其實也是gm的由來),也可以是ImageMagick(其實GraphicsMagic本身也是從ImageMagic分割而來,現在獨立了)。雖然這兩個工具本身都不是js實現,所以需要額外安裝,不過此工具非常常見,可能已經預先安裝在linux系統下,而且安裝也很方便,所以不用因為看到是「第三方」就放棄。雖然說這兩個軟體都只是底層,不用關心,但實作者在實務上發現必須得用GraphicsMagic,所以這裡就只介紹GraphicsMagics的安裝與使用。
GaphicsMagic 安裝
GraphicsMagic 官網是:http://www.graphicsmagick.org/
官網和網路上大多數教學課程都是教如何編譯,可個人覺得可以直接透過軟體庫安裝,例如
apt-get install graphicsmagic
如果要學習用命令列的方式使用GraphicsMagic可以看這裡:http://www.jb51.net/LINUXjishu/120332.html
Nodejs下的gm安裝
gm是一個node庫,所以可用npm安裝
npm install gm
官方文件:http://aheckmann.github. io/gm/
圓形剪裁原理
gm是對GraphicsMagic的封裝,所以理論上GraphicsMagic有的功能都能透過gm以介面的形式實現。 gm本身不支援圓形剪裁(至少筆者不知如何實現),同樣意味著其底層也不直接支援。
gm比較常用的功能是:縮放、方形裁切、格式轉換。
所以本教學的圓形裁切的核心是 借助SVG ,透過svg建構一個圓形的圖片,然後透過gm轉換為png,也就是利用svg變換圖片格式。
SVG是可以實現圓形圖片的裁剪的,網上查到有兩種方式實現圓形裁剪
1、透過clip-path
定義一個圓形的路徑,然後在圖片的style中設定clip-path,也就是透過這個這樣實現圖片裁剪,理論上是真正意義上的「裁剪」
<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可以看這個教學
可是這樣的配置在瀏覽器上看沒有絲毫問題,但是發現透過gm轉化為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>
先定義一個圖案,也就是原來的圖片,然後創建個圓形,並用剛剛定義的圖案填充在這個圓形裡面即可。
合成圖片原理
懂的上述剪裁的原理,合成就變得簡單了。直接把想要合成的圖片以svg的方式拼湊在一起即可。雖然gm本身支援圖片合成,使用compose或mosaic (詳見這個 教學 )不過感覺不如svg更明了。
注意筆者嘗試透過svg加上文字,不過發現中文字無法被識別,所以仍然只能透過gm添加,添加時需要設定字體(詳見下一章程式碼實現)
如果要在一個大圖中嵌入兩張圓形的圖片,則需要設定兩個pattern,這時有個經驗:
pattern的x和y設定為0, 0
pattern的width和height設定的和畫布一樣
image的x,y設定為其「實際位置」 ,也就是對應circle 的cx-r 以及cy-r ,剪r 是因為cx和cy指的是圓形中心,而x,y是圖形的左上角位置。
程式碼實作
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 }) }) })
上面是我整理給大家的,希望今後會對大家有幫助。
相關文章:
#以上是在Nodejs下使用gm裁切在合成圖片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Node.js 是一種伺服器端 JavaScript 執行時,而 Vue.js 是一個客戶端 JavaScript 框架,用於建立互動式使用者介面。 Node.js 用於伺服器端開發,如後端服務 API 開發和資料處理,而 Vue.js 用於用戶端開發,如單一頁面應用程式和響應式使用者介面。

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

Node.js 專案的伺服器部署步驟:準備部署環境:取得伺服器存取權限、安裝 Node.js、設定 Git 儲存庫。建置應用程式:使用 npm run build 產生可部署程式碼和相依性。上傳程式碼到伺服器:透過 Git 或檔案傳輸協定。安裝依賴項:SSH 登入伺服器並使用 npm install 安裝應用程式相依性。啟動應用程式:使用 node index.js 等命令啟動應用程序,或使用 pm2 等進程管理器。設定反向代理(可選):使用 Nginx 或 Apache 等反向代理路由流量到應用程式
