Nodejs圖片編輯和中文亂碼

近期證書生成的活動比較流行叨吮,如馬拉松證書生成活動辆布,運營同學打算做一個大學錄取通知書的活動。以前相關的活動都在nodejs服務器上進行開發(fā)茶鉴,這次也就不例外了锋玲。

nodejs的圖片處理庫不少,使用比較多的有以下幾個:

  1. node-images:在cnode上有node-iamges作者寫的文章涵叮。這個庫安裝簡單惭蹂,依賴少伞插;借助它可以實現(xiàn)改變圖片大小、圖片合并等功能盾碗。本打算使用它進行開發(fā)媚污,但是由于其不支持文字寫入,只好另尋他路了廷雅。
  2. node canvas:這個庫我調(diào)研的較少耗美,百度上有不少文章,大家可以自行查看進行判斷榜轿,其中此文介紹了其在百度地圖上的使用幽歼,說明其功能還是很強大的。
  3. gm: gm是nodejs對GraphicsMagick和ImageMagick封裝谬盐。GraphicsMagick和ImageMagick是老牌的圖片處理工具甸私,它們功能很強大,包括了圖片的創(chuàng)建飞傀、編輯皇型、合成、讀取砸烦、轉換弃鸦、切割、顏色替換等各種圖片處理功能幢痘。 gm基于它倆進行開發(fā)唬格,可知gm的功能強大。功能的強大就可能意味著安裝和使用的復雜颜说!本文主要介紹gm的安裝和使用方法购岗;同時對經(jīng)常遇到的中文亂碼問題進行了介紹。由于開發(fā)機器是mac门粪,所以只覆蓋到了mac和linux系統(tǒng)喊积。

安裝gm

gm在mac上的安裝比較簡單,依據(jù)npm上的介紹進行即可:

  brew install imagemagick
  brew install graphicsmagick

在linux上安裝gm玄妈,我參考了GraphicsMagick介紹及安裝乾吻,,服務器是阿里云拟蜻,主要步驟如下:

  • 獲取安裝包
  wget http://iweb.dl.sourceforge.net/project/graphicsmagick/graphicsmagick/1.3.23/GraphicsMagick-1.3.23.tar.gz
  • 解壓然后執(zhí)行configure和make make install
tar -zvf GraphicsMagick-1.3.23.tar.gz
cd GraphicsMagick-1.3.23/
./configure
make
make install
  • 執(zhí)行:convert -v, 看到如下內(nèi)容绎签,就說明安裝成功了:
Paste_Image.png

在工程目錄執(zhí)行: npm install gm
安裝完成后,在nodejs中使用gm:

    var fs = require('fs'); 
    var gm = require('gm');
    gm('./resources/dev/images/help/1_big.jpg')    
        .draw('image Over 100, 100 100, 100 "./resources/dev/images/app/actGuide.png"')
        .write('./resources/dev/images/app/aboutus_modify.jpg', function(err) {        
              if (!err){  console.log('done');       
              }else{console.log(err.message || "出錯了酝锅!"); } });

執(zhí)行后辜御,可以看到aboutus_modify.jpg是1_big.jpg和actGuide.png的合成。

1_big.jpg

actGuide.png

aboutus_modify.jpg

需要特別注意gm中函數(shù)參數(shù)的寫法屈张,其函數(shù)說明文檔地址是:draw函數(shù)說明擒权,對比上述例子中寫法袱巨,希望大家多加注意。

另外:gm的APi文檔地址是:gm API文檔 碳抄,可以結合GraphicsMagick的文檔使用愉老。

中文亂碼

gm正常跑起來后,經(jīng)常會遇到中文亂碼問題剖效。在以往GraphicsMagick的使用中嫉入,已經(jīng)有不少關于這方面的總結:

  1. how to use imagick annotateImage for chinese text? --php
  2. GM中文亂碼如何解決? -- node
  3. GraphicsMagick中文亂碼解決辦法 -- java
  4. 如何用imagemagick在圖片上寫中文 -- cmd
  5. 用ImageMagick在圖片中寫中文的問題及解決 --cmd

上述文章中作者都對中文亂碼問題提出了自己的解決方法璧尸,在GraphicsMagick的文檔和社區(qū)中也有對這類問題的解答:

  1. ImageMagick v6 Examples
  2. how to apply imagemagic to other language?

總結起來解決亂碼需滿足兩個條件:1. 文檔utf-8編碼咒林; 2. 指定中文字體庫。

結合Demo程序進行說明:

var gm = require('gm');
var _name = "China中文";
gm('./resources/dev/images/help/1_big.jpg')
    .draw('image Over 100, 100 100, 100 "./resources/dev/images/app/actGuide.png"')
    .font('/Library/Fonts/微軟雅黑.ttf')
    // .font('/usr/share/fonts/微軟雅黑.ttf')  /* 服務器上的路徑*/
    .draw('text  100, 100 '+_name)
    // .resize(240, 240)
    .write('./resources/dev/images/app/aboutus_modify.jpg', function(err) {
        if (!err){
            console.log('done');
        }else{
            console.log(err.message || "出錯了爷光!");
        }
    });

上面程序得到的結果如下垫竞,可以看到中文能正常顯示,而且字體也是我們指定的微軟雅黑:


文字和圖片嵌入成功.png

我們來分析下解決亂碼的兩個條件:

  1. 文檔utf-8編碼:這里utf-8編碼是指要求文件的存儲編碼方式是utf-8蛀序,而不是對字符進行utf-8編碼(如js中的encodeURI)欢瞪。通過對IDE或者其他方式確定文件的編碼方式,如有問題可自行百度徐裸。

  2. 指定中文字體庫:可以通過 .font('/Library/Fonts/微軟雅黑.ttf') //mac系統(tǒng)下.font('/usr/share/fonts/微軟雅黑.ttf') //linux系統(tǒng)下指定遣鼓。 font函數(shù)的參數(shù)是字體在系統(tǒng)中的存儲路徑。

Mac電腦的字體存儲文件路徑是:/Library/Fonts/重贺,如下圖所示:

Paste_Image.png

linux下骑祟, fc-list: 查詢所有安裝字體,fc-list :lang=zh:查詢安裝的中文字體气笙, 字體的安裝路徑是:/usr/share/fonts次企。

Paste_Image.png

如果需要安裝特定字體,可以到這個網(wǎng)站上下載健民,然后依據(jù)不同平臺進行安裝:

  1. Windows 7 / Vista - 選定文件點擊右鍵選安裝
  2. Windows XP - 復制和粘貼字體文件到C:\WINDOWS\FONTS
  3. Mac OS X - 雙擊字體文件然后選擇安裝字體
  4. Linux - 復制字體文件到/USR/SHARE/FONTS

總結

文章簡要介紹了gm模塊的使用以及可能遇到的中文亂碼問題,希望對大家有多幫助贫贝。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秉犹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稚晚,更是在濱河造成了極大的恐慌崇堵,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客燕,死亡現(xiàn)場離奇詭異鸳劳,居然都是意外死亡,警方通過查閱死者的電腦和手機也搓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門赏廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涵紊,“玉大人,你說我怎么就攤上這事幔摸∶” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵既忆,是天一觀的道長驱负。 經(jīng)常有香客問我,道長患雇,這世上最難降的妖魔是什么跃脊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮苛吱,結果婚禮上酪术,老公的妹妹穿的比我還像新娘。我一直安慰自己又谋,他們只是感情好拼缝,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彰亥,像睡著了一般咧七。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上任斋,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天继阻,我揣著相機與錄音,去河邊找鬼废酷。 笑死瘟檩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的澈蟆。 我是一名探鬼主播墨辛,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趴俘!你這毒婦竟也來了睹簇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤寥闪,失蹤者是張志新(化名)和其女友劉穎太惠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疲憋,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡凿渊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埃脏。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡搪锣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剂癌,到底是詐尸還是另有隱情淤翔,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布佩谷,位于F島的核電站旁壮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谐檀。R本人自食惡果不足惜抡谐,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桐猬。 院中可真熱鬧麦撵,春花似錦、人聲如沸溃肪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫撰。三九已至羔沙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厨钻,已是汗流浹背扼雏。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夯膀,地道東北人诗充。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像诱建,于是被迫代替她去往敵國和親蝴蜓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容