麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

Nodejs下使用gm圓形裁剪并合成圖片的示例

2019-11-19 14:20:14
字體:
來源:轉載
供稿:網友

說到Nodejs下的圖片處理可能第一想到就是gm,gm底層可以是GraphicsMagic(其實也是gm的由來),也可以是ImageMagick(其實GraphicsMagic本身也是從ImageMagic分割而來,現在獨立了)。雖然這兩個工具本身都不是js實現,所以需要額外安裝,不過此工具非常常見,可能已經預裝在linux系統下,而且安裝也很方便,所以不用因為看到是“第三方”就放棄。雖然說這兩個軟件都只是底層,無需關心,可筆者在實踐中發現必須得用GraphicsMagic,所以這里就只介紹GraphicsMagics的安裝與使用。

GaphicsMagic 安裝

GraphicsMagic 官網是: http://www.graphicsmagick.org/

官網和網上大多數教程都是教如何編譯,可個人覺得可以直接通過軟件庫安裝,比如

apt-get install graphicsmagic

如果要學習用命令行的方式使用GraphicsMagic可以看這里://www.companysz.com/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,這時有個經驗:

  1. pattern的x和y設置為0,0
  2. pattern的width和height設置的和 畫布 一樣
  3. 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 = 10fs.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    })  })})

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品久久久久久国产三级 | 国产精品久久久久久久久久三级 | 羞羞网站在线观看入口免费 | 欧美日韩后 | 久久久免费电影 | 国产精品久久av | 日日鲁夜夜视频热线播放 | 高清国产午夜精品久久久久久 | 香蕉在线播放 | 草碰人人| 一区二区三区日韩精品 | 在线播放免费人成毛片乱码 | 国产流白浆高潮在线观看 | 一级网站片| 久久久久久精 | 成人毛片视频免费看 | 国产精品久久久不卡 | 中文字幕网站在线 | 欧美精品一区二区久久 | av黄色片网站 | 久久丝袜脚交足黄网站免费 | arabxxxxvideos| 鲁久久| 久久久一区二区精品 | 哪里可以看免费的av | 久久亚洲国产精品 | 在线中文字幕亚洲 | 亚洲午夜精品视频 | 二区三区四区 | 一本到免费视频 | 成人做爰s片免费看网站 | 国产成人综合在线观看 | 国产1区在线观看 | 91短视频免费 | 亚州欧美视频 | 草人人 | 亚洲一区二区在线免费 | 91精品国产网站 | 中文字幕在线播放一区 | 欧美高清在线精品一区二区不卡 | 亚洲国产网站 |