前言
難度:簡單
類型:step-by-step
適用:有 node.js 基礎(chǔ)和 linux 基礎(chǔ)
開發(fā)環(huán)境:jdk 1.8
關(guān)鍵詞:node.js graphicsmagick imagemagick
筆者環(huán)境:macOS
服務(wù)器環(huán)境:CentOS 7
目標(biāo):
- gm 和 im 的底層類庫的安裝
- nodejs 的Restful簡單項目搭建
- gm&im for node 庫的基本使用
- 完成簡單的 Restful 圖片處理服務(wù)
1. 底層支持
1.1 支持類庫安裝
由于默認(rèn) gm 和 im 都不帶 jpeg 和 png 的格式支持,所以需要先安裝這兩個文件格式支持的庫。
1.1.1 開發(fā)環(huán)境
以 macOS 為例,推薦兩種方式,src 編譯安裝或者 homebrew 安裝——
src 下載地址:ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates/
找到對應(yīng)的庫的最新版本的包,例如: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 中對應(yīng)的庫名,如果找不到,請先升級 brew,執(zhí)行命令:brew update。
然后執(zhí)行安裝命令:
>brew install libpng
>brew install libjpeg-turbo
1.1.2 服務(wù)器環(huán)境
以 CentOS7為例,可以選擇上述第一種下載編譯安裝的方式,同樣也可以選擇yum安裝的方式。
執(zhí)行命令:
>yum search libpng
>yum search libjpeg
如果找不到相關(guān)的庫,請更換 yum 源。
找到對應(yīng)的庫執(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。
沒有特殊需求可以直接命令無腦編譯安裝,有特殊要求的話,可以參考兩個網(wǎng)站上的編譯配置,按照自己的需求進(jìn)行配置后編譯安裝。
直接安裝執(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 服務(wù)器環(huán)境
選擇編譯安裝的話,同上,按照地址下載回來,配置編譯并安裝,推薦先升級下服務(wù)器,保證 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)境和服務(wù)器環(huán)境的底層類庫支持都安裝完畢。
2.Node.js 搭建圖片處理服務(wù)
2.1 搭建Restful項目
2.1.1 項目初始化
Node.js 環(huán)境的安裝,這里不在贅述,簡單快速的實現(xià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,不指定,默認(rèn)是用 gm。
增加處理接口,代碼如下:
/**
* 處理圖片
*/
router.get('/img', function (req, res, next) {
//圖片 url 參數(shù)
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() //刪除無關(guān)信息
.samplingFactor(2, 2) //設(shè)置色彩 4:2:0,降低體積
.interlace('Line') //設(shè)置為逐行
.quality(85) //質(zhì)量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
});
}
});
});

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

得到的響應(yīng)數(shù)據(jù)為:
{
status: true,
message: "success"
}
3. 結(jié)語
至此,圖片壓縮處理的 Resuful 服務(wù)搭建完成,想要了解更多的使用信息,可以參考項目文檔,地址:
https://github.com/aheckmann/gm
也可以去 gm 和 im 的官網(wǎng)參考兩個工具的命令文檔,地址為:
http://www.graphicsmagick.org/GraphicsMagick.html
https://www.imagemagick.org/script/command-line-processing.php