使用 Node.js 快速搭建圖片處理服務

前言

難度:簡單
類型:step-by-step
適用:有 node.js 基礎和 linux 基礎
開發(fā)環(huán)境:jdk 1.8
關鍵詞:node.js graphicsmagick imagemagick
筆者環(huán)境:macOS
服務器環(huán)境:CentOS 7

目標:

  • gm 和 im 的底層類庫的安裝
  • nodejs 的Restful簡單項目搭建
  • gm&im for node 庫的基本使用
  • 完成簡單的 Restful 圖片處理服務

1. 底層支持

1.1 支持類庫安裝

由于默認 gm 和 im 都不帶 jpeg 和 png 的格式支持伪朽,所以需要先安裝這兩個文件格式支持的庫桐经。

1.1.1 開發(fā)環(huán)境

以 macOS 為例歉眷,推薦兩種方式屡萤,src 編譯安裝或者 homebrew 安裝——

src 下載地址:ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates/

找到對應的庫的最新版本的包隘冲,例如:png 的是lib-1.6.28.tar.gz,jpeg的是jpegsrc-v9c.tar.gz

不過 jpeg 的類庫推薦使用另外一個libjpeg-tubor,處理性能提升20%以上刨裆,下載地址是:
https://libjpeg-turbo.org/Documentation/OfficialBinaries

下載完成后,執(zhí)行編譯和安裝命令:

>./configure
>make & make install

mac 環(huán)境下還可以選擇 brew 命令安裝彬檀,相對來說更加簡單和方便帆啃,執(zhí)行命令:

>brew search libpng
>brew search libjepg

可以查看到 brew 中對應的庫名,如果找不到窍帝,請先升級 brew努潘,執(zhí)行命令:brew update

然后執(zhí)行安裝命令:

>brew install libpng
>brew install libjpeg-turbo

1.1.2 服務器環(huán)境

以 CentOS7為例坤学,可以選擇上述第一種下載編譯安裝的方式疯坤,同樣也可以選擇yum安裝的方式。

執(zhí)行命令:

>yum search libpng
>yum search libjpeg

如果找不到相關的庫深浮,請更換 yum 源压怠。
找到對應的庫執(zhí)行命令:

>yum install libpng.x86_64
>yum install libjpeg-turbo.x86_64

1.2 圖片處理類庫安裝

1.2.1 開發(fā)環(huán)境

類似支持類庫的安裝方式,同樣可以選擇兩種安裝方式略号,編譯和 brew 安裝。

編譯安裝:
gm 下載地址:http://www.graphicsmagick.org/
im 下載地址:http://www.graphicsmagick.org/

如果想對比下兩個不同的類庫洋闽,可以都下載安裝玄柠,親測無沖突。如果只想盡快搭建诫舅,推薦處理性能更高的 gm羽利。

沒有特殊需求可以直接命令無腦編譯安裝,有特殊要求的話刊懈,可以參考兩個網站上的編譯配置这弧,按照自己的需求進行配置后編譯安裝。

直接安裝執(zhí)行:

>./configure
>make & make install

如果編譯失敗虚汛,請升級GCC匾浪。


命令安裝,跟之前類似卷哩,先搜索類庫蛋辈,然后找到后執(zhí)行 install 命令:

#搜索并安裝gm
>brew search graphicsmagick
>brew install graphicsmagick
#搜索并安裝im
>brew search imagemagick
>brew install imagemagick
#如果想添加對 webp 的支持,執(zhí)行
>brew install imagemagick --with-webp

找不到的話,請升級 homebrew冷溶。

1.2.2 服務器環(huán)境

選擇編譯安裝的話渐白,同上,按照地址下載回來逞频,配置編譯并安裝纯衍,推薦先升級下服務器,保證 gcc 是最新的苗胀,執(zhí)行命令:

>yum update & yum upgrade

然后再編譯安裝襟诸。


選擇 yum 安裝步驟差不多,執(zhí)行命令:

#搜索并安裝 gm
>yum search graphicsmagick
>yum install Graphicsmagick.x86_64
#搜索并安裝 im
>yum search imagemagick
>yum install ImageMagick.x86_64

至此柒巫,開發(fā)環(huán)境和服務器環(huán)境的底層類庫支持都安裝完畢励堡。

2.Node.js 搭建圖片處理服務

2.1 搭建Restful項目

2.1.1 項目初始化

Node.js 環(huán)境的安裝,這里不在贅述堡掏,簡單快速的實現应结,例如創(chuàng)建一個名字叫:test.gm的項目,執(zhí)行命令:

>express test.gm
>npm install
>npm start

訪問:http://localhost:3000泉唁,成功創(chuàng)建項目鹅龄。

2.2.2 添加 gm和 im 的 支持庫

執(zhí)行命令:npm install gm --save,這個類庫同時支持 gm 和 im亭畜。

打開project.json扮休,看到dependencies中多了:"gm": "^1.23.1",添加成功拴鸵。

2.2.3 使用 gm 庫處理圖片

打開~/router/index.js添加對 fs 和 gm 的引用:

var fs = require('fs');
var gm = require('gm').subClass({imageMagick: true});

其中subClass({imageMagick: true})指定使用 im玷坠,不指定,默認是用 gm劲藐。


增加處理接口八堡,代碼如下:

/**
 * 處理圖片
 */
router.get('/img', function (req, res, next) {

  //圖片 url 參數
  let url = req.query['url'];

  if (!url) {
    res.send({
      status: false,
      message: "no url param."
    });
    return;
  }

  gm(url) //讀取圖片 url 或者 本地路徑 或者 stream buffer
    .resize(100, 100) //按照100*100的尺寸壓縮圖片
    .noProfile() //去掉 exif 信息
    .strip() //刪除無關信息
    .samplingFactor(2, 2) //設置色彩 4:2:0,降低體積
    .interlace('Line') //設置為逐行
    .quality(85) //質量85聘芜,jpeg大與85體積會成倍增加
    //保存到項目靜態(tài)文件地址
    .write(global.imagePath + "/resized.jpg", (err) => {
      if (err) {
        //處理失敗        
        res.send({
          status: false,
          message: err.message
        });
      } else {
        //處理成功
        res.send({
          status: true
        });
      }
    });

});

例如兄渺,隨便百度了一張圖片:
https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=13dc7fee3512b31bd86ccb29b6193674/730e0cf3d7ca7bcb6a172486b2096b63f624a82f.jpg

待處理圖片

請求地址:
http://localhost:3000/img?url=https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=13dc7fee3512b31bd86ccb29b6193674/730e0cf3d7ca7bcb6a172486b2096b63f624a82f.jpg

處理完成圖片為:
http://localhost:3000/images/resized.jpg

image.png

得到的響應數據為:

{
status: true,
message: "success"
}

3. 結語

至此,圖片壓縮處理的 Resuful 服務搭建完成汰现,想要了解更多的使用信息挂谍,可以參考項目文檔,地址:
https://github.com/aheckmann/gm
也可以去 gm 和 im 的官網參考兩個工具的命令文檔瞎饲,地址為:
http://www.graphicsmagick.org/GraphicsMagick.html
https://www.imagemagick.org/script/command-line-processing.php

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末口叙,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子嗅战,更是在濱河造成了極大的恐慌庐扫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異形庭,居然都是意外死亡铅辞,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門萨醒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斟珊,“玉大人,你說我怎么就攤上這事富纸《诓龋” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵晓褪,是天一觀的道長堵漱。 經常有香客問我,道長涣仿,這世上最難降的妖魔是什么勤庐? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮好港,結果婚禮上愉镰,老公的妹妹穿的比我還像新娘。我一直安慰自己钧汹,他們只是感情好丈探,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔莱,像睡著了一般碗降。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塘秦,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天讼渊,我揣著相機與錄音,去河邊找鬼嗤形。 笑死精偿,一個胖子當著我的面吹牛弧圆,可吹牛的內容都是我干的赋兵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼搔预,長吁一口氣:“原來是場噩夢啊……” “哼霹期!你這毒婦竟也來了?” 一聲冷哼從身側響起拯田,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤历造,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體吭产,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡侣监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了臣淤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橄霉。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邑蒋,靈堂內的尸體忽然破棺而出姓蜂,到底是詐尸還是另有隱情,我是刑警寧澤医吊,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布钱慢,位于F島的核電站,受9級特大地震影響卿堂,放射性物質發(fā)生泄漏束莫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一御吞、第九天 我趴在偏房一處隱蔽的房頂上張望麦箍。 院中可真熱鬧,春花似錦陶珠、人聲如沸挟裂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诀蓉。三九已至,卻和暖如春暑脆,著一層夾襖步出監(jiān)牢的瞬間渠啤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工添吗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沥曹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刀崖。 傳聞我的和親對象是個殘疾皇子侠鳄,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345