摘要:是一款創(chuàng)建編輯合成,轉(zhuǎn)換圖像的命令行工具。上面兩條三次貝塞爾曲線的坐標(biāo)分別表示起始點(diǎn),起始點(diǎn)的控制點(diǎn),結(jié)束點(diǎn)的控制點(diǎn),結(jié)束點(diǎn)。
在客戶端我們可以用 PhotoShop 等 GUI 工具處理靜態(tài)圖片或者動(dòng)態(tài) GIF 圖片,不過(guò)在服務(wù)器端對(duì)于 WEB 應(yīng)用程序要處理圖片格式轉(zhuǎn)換,縮放裁剪,翻轉(zhuǎn)扭曲,PDF解析等操作, GUI 軟件就很難下手了,所以此處需要召喚命令行工具來(lái)幫我們完成這些事。
ImageMagick: 是一款創(chuàng)建、編輯、合成,轉(zhuǎn)換圖像的命令行工具。支持格式超過(guò) 200 種,包括常見(jiàn)的 PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, SVG 等。功能包括調(diào)整,翻轉(zhuǎn),鏡像(mirror),旋轉(zhuǎn),扭曲,修剪和變換圖像,調(diào)整圖像顏色,應(yīng)用各種特殊效果,或繪制文本,線條,多邊形,橢圓和貝塞爾曲線等。
官網(wǎng):https://www.imagemagick.org,下面放個(gè)小標(biāo)識(shí)。
安裝 ImageMagick支持 Linux, Windows, Mac OS X, iOS, Android OS 等平臺(tái)
https://www.imagemagick.org/s...
因?yàn)槲沂?MAC 機(jī)器,演示一下 brew 的安裝方式咯
brew install imagemagick基本命令與格式 1、基本命令
ImageMagick 包括一組命令行工具來(lái)操作圖片,安裝好 ImageMagick 后,終端就可以使用如下命令了。
magick: 創(chuàng)建、編輯圖像,轉(zhuǎn)換圖像格式,以及調(diào)整圖像大小、模糊、裁切、除去雜點(diǎn)、抖動(dòng) ( dither )、繪圖、翻轉(zhuǎn)、合并、重新采樣等。
convert: 等同于 magick 命令。
identify: 輸出一個(gè)或多個(gè)圖像文件的格式和特征信息,如分辨率、大小、尺寸、色彩空間等。
mogrify: 與 magick 功能一樣,不過(guò)不需要指定輸出文件,自動(dòng)覆蓋原始圖像文件。
composite: 將一個(gè)圖片或多個(gè)圖片組合成新圖片。
montage: 組合多個(gè)獨(dú)立的圖像來(lái)創(chuàng)建合成圖像。每個(gè)圖像都可以用邊框,透明度等特性進(jìn)行裝飾。
compare: 從數(shù)學(xué)和視覺(jué)角度比較源圖像與重建圖像之間的差異。
display: 在任何 X server 上顯示一個(gè)圖像或圖像序列。
animate: 在任何 X server 上顯示圖像序列。
import: 保存 X server 上的任何可見(jiàn)窗口并把它作為圖像文件輸出??梢圆蹲絾蝹€(gè)窗口,整個(gè)屏幕或屏幕的任意矩形部分。
conjure: 解釋并執(zhí)行 MSL ( Magick Scripting Language ) 寫的腳本。
stream: 一個(gè)輕量級(jí)工具,用于將圖像或部分圖像的一個(gè)或多個(gè)像素組件流式傳輸?shù)酱鎯?chǔ)設(shè)備。在處理大圖像或原始像素組件時(shí)很有用。
基本命令的使用,遵循 Unix 風(fēng)格的標(biāo)準(zhǔn)格式:
command [options] input_image output_image
比如我們將一張寬高 300x300 的圖片 goods.png 轉(zhuǎn)換成 200x200 的goods.jpg,可以這樣用
convert -resize 200x200 goods.png goods.jpg
-resize 定義圖片尺寸,ImageMagick 所有的選項(xiàng)參數(shù)都在這個(gè)【命令行選項(xiàng)手冊(cè)】。
但是隨著功能的復(fù)雜,命令緩慢擴(kuò)大成了這樣的格式:
command [options] image1 [options] image2 [options] output_image
于是上面的命令也可以寫成這樣
convert goods.png -resize 200x200 goods.jpg
筆記:個(gè)人建議,如果轉(zhuǎn)換的是一張圖片,那么用第一種格式,因?yàn)橄?-density 等一些選項(xiàng)必須放在 command 與 input_image 之間,所以為了省記都不寫錯(cuò),都寫在 command 與 input_image 之間豈不很好。
但是如果是多張圖片轉(zhuǎn)換,就需要按第二種格式,正確輸出命令選項(xiàng)了。
提示:如果上面的工具命令在計(jì)算機(jī)上不可以使用,則可以把它們當(dāng)作 magick 命令的子命令使用,例如
magick identify goods.png3、指定文件格式
默認(rèn)情況下 ImageMagick 會(huì)讀取圖像中唯一標(biāo)識(shí)格式的簽名來(lái)確定文件格式,如果沒(méi)有,則根據(jù)文件的擴(kuò)展名來(lái)確定格式,如 image.jpg 被認(rèn)為 jpeg 格式文件,如果都獲取不到,則需要手動(dòng)指定文件的格式。命令格式為 format:input_or_output_image。
輸入文件一般情況應(yīng)該不需要手動(dòng)指定文件格式,輸出文件的時(shí)候,png 格式分 png8、png24 等格式,如果 png8 格式的文件能夠滿足需求,指定合理的格式可以縮小文件的大小,示例如下。
convert goods.png png8:goods_8.png convert goods.png png24:goods_24.png實(shí)際案例
文中案例基于 ImageMagick 7.0.71、生成縮略圖
需求:將一張寬高為 900x600 的圖片 goods.jpg 生成寬高為 150x100 的縮略圖 thumbnail.jpg
convert -resize 150x100 -quality 70 -strip goods.jpg thumbnail.jpg
解釋:
-resize 150x100:定義輸出的縮略圖尺寸為 150x100。
-quality 70:降低縮略圖的質(zhì)量為 70,取值范圍 1 ( 最低圖像質(zhì)量和最高壓縮率 ) 到 100 ( 最高圖像質(zhì)量和最低壓縮率 ),默認(rèn)值根據(jù)輸出格式有 75、92、100,選項(xiàng)適用于 JPEG / MIFF / PNG。
-strip:讓縮略圖移除圖片內(nèi)嵌的所有配置文件,注釋等信息,以減小文件大小。
-resize 延伸解讀,如下。
上面的例子中,輸入的圖片和輸出的圖片比例是一致的,所以不會(huì)有特殊情況出現(xiàn),但是遇到比例不同的時(shí)候,上面的寫法并不會(huì)得到 150x100 的圖像,而是會(huì)根據(jù)圖像的寬高比例,取最大值,得出來(lái)的結(jié)果可能是 150 寬和更小的高,或者 100 高和更小的寬;所以 IamgeMagick 提供了幾種符號(hào)來(lái)定義縮放。
convert -resize "150x100!" goods.jpg thumbnail.jpg convert -resize "150x100>" goods.jpg thumbnail.jpg convert -resize "150x100<" goods.jpg thumbnail.jpg
!:不管圖片寬高如何,都縮放成 150x100 這樣的尺寸。
>:只有寬高均大于 150x100 的圖片才縮放成該尺寸 ( 按比例取最大值 ),小于的圖片不做處理。
<:與 > 功能相反。
提示:因?yàn)橛行┳址?Linux shell 或其他系統(tǒng)的特殊字符,所以需要用引號(hào)包裹起來(lái)或者用反斜線 轉(zhuǎn)義,注意,不同平臺(tái)可能引號(hào)都是有差異的。
2、添加水印需求 ① :給圖片居中加上透明文本水印。
convert -draw "text 0,0 "JD.COM"" -fill "rgba(221, 34, 17, 0.25)" -pointsize 36 -font "cochin.ttc" -gravity center joy.jpg watermark.jpg
解釋:
-draw:繪圖選項(xiàng),text 聲明繪制文本, 0,0聲明文本距離圖片左上角的偏移值, JD.COM聲明繪制的文本,最好用引號(hào)包裹起來(lái),避免輸入特殊字符引起錯(cuò)誤。繪制文本的格式為 text x,y string,當(dāng)然還可以繪制其他類型,諸如圓 ( circle )、折線 ( polyline )。
-fill:對(duì)文本填充顏色,貌似 ImageMagick 命令中前面的選項(xiàng)是用來(lái)控制后面的選項(xiàng)的,所以應(yīng)該把這樣的修飾選項(xiàng)放到 -draw 前面比較好,很重要,后面的案例就是這樣的。
-pointsize:指定文本的字體大小。
-font:指定字體。
-gravity:設(shè)置文本在圖片里的排列方式 ( 類似 CSS 里的 align-items + justify-content ),center 表示水平垂直都居中,其他值還可以是:NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast,不記大小寫。
:反斜線也是類 Unix 系統(tǒng)的續(xù)行字符,當(dāng)一個(gè)命令很長(zhǎng)時(shí),我們可以把它寫成多行,以便視覺(jué)上的美觀和直觀。
需求 ② :給圖片加上傾斜平鋪透明文本水印。
convert -size 100x100 xc:none -fill "#d90f02" -pointsize 18 -font "cochin.ttc" -gravity center -draw "rotate -45 text 0,0 "JD.COM"" -resize 60% miff:- | composite -tile -dissolve 25 - joy.jpg watermark.jpg
解釋:文本平鋪水印其實(shí)是將文本畫成一張 png 圖片,然后用這張透明圖片在目標(biāo)圖片上進(jìn)行平鋪。
-size:設(shè)置畫布的大小。
xc::全稱 X Constant Image,是 canvas:的別名,定義一張畫布,用來(lái)繪圖,常用格式為 xc:color,none 或者 transparent 設(shè)置畫布為透明底,默認(rèn)為白色。
-resize:該選項(xiàng)還可以指定百分比,意為縮放至原圖像的百分之幾。貌似 -pointsize 小于 14 后,-draw 里的 rotate 會(huì)不生效,所以用 -resize 來(lái)把平鋪圖案變得更小。
miff:-:
miff: 聲明輸出 ImageMagick ( IM ) 自己的圖像文件格式:MIFF,主要用途是以復(fù)雜的方式處理圖像時(shí)當(dāng)做中間保存格式,適用于從一個(gè) IM 命令向另一個(gè) IM 命令傳遞圖像元數(shù)據(jù)和其他關(guān)聯(lián)屬性。
- 在管道符前面意為將 IM 命令執(zhí)行的結(jié)果作為標(biāo)準(zhǔn)輸出,在管道符后面則表示從標(biāo)準(zhǔn)輸入中讀取這個(gè)數(shù)據(jù),如在管道符后面的 composite 中使用 - 讀取剛剛生成的透明圖像。
|:Linux shell 管道符,用于將上一個(gè)命令的標(biāo)準(zhǔn)輸出傳遞到下一個(gè)命令作為標(biāo)準(zhǔn)輸入。這里將生成的水印圖案?jìng)鬟f給 composite 命令。
-tile:顧名思義,讓圖案平鋪。
-dissolve:設(shè)置平鋪圖案的透明度。
圖釋:
3、繪制驗(yàn)證碼大概邏輯如下:
隨機(jī)生成 4 個(gè)英文字母或數(shù)字。
創(chuàng)建一個(gè)寬高 100x40 的畫布。
設(shè)置字體大小為 16,每個(gè)字符的寬高也就是 16 左右了,依次計(jì)算出每個(gè)字符的 x, y 坐標(biāo),再增加一丁點(diǎn)旋轉(zhuǎn)。
隨機(jī)創(chuàng)建一條透明曲線,加上噪點(diǎn),增加圖片被破解的難度(在保證肉眼能看得清楚的用戶體驗(yàn)下)。
如果需要安全性更高的驗(yàn)證碼,請(qǐng)了解驗(yàn)證碼破解原理并做合理調(diào)整。
如果加上隨機(jī)計(jì)算,可能代碼會(huì)比較多,所以這里寫成固定值,方便理解。
convert "xc:[100x40!]" -pointsize 20 -font "cochin.ttc" -gravity NorthWest -strokewidth 1 -fill "#b72b36" -stroke "#b72b36" -draw "translate 13,19 rotate 10 text -5,-8 "5"" -fill "#821d70" -stroke "#821d70" -draw "translate 36,13 rotate -8 text -8,-8 "C"" -fill "#c7960a" -stroke "#c7960a" -draw "translate 60,23 rotate 5 text -5,-8 "2"" -fill "#03610a" -stroke "#03610a" -draw "translate 85,25 rotate 13 text -8,-8 "E"" -strokewidth 2 -stroke "rgba(248, 100, 30, 0.5)" -fill "rgba(0, 0, 0, 0)" -draw "bezier -20,30 -16,10 20,2 50,20" -draw "bezier 50,20 78,42 138,36 140,16" +noise Impulse captcha.jpg
結(jié)果:
鑒于字體比較細(xì),可以用 strokewidth 加邊框來(lái)加粗,或者使用字體的粗體版本,這里使用了第一種方式。
解釋:
xc:[100x40!]:設(shè)置畫布大小的一種簡(jiǎn)寫方式,方括號(hào)里寫入畫布寬高,注意要加 !,否則會(huì)出乎意料喲。
文本定位與旋轉(zhuǎn)
畫布寬 100px,平均分成 4 分,每份 25px, 文字寬 16px, 得文字 x 的坐標(biāo)左右擺動(dòng)范圍為 +0px, +9px,y 坐標(biāo)同理,用于設(shè)置 translate 值。
實(shí)際上字體本身并沒(méi)有填充滿整個(gè) 16x16 的區(qū)域,根據(jù)字體的不同,填滿的區(qū)域可能各有不同,所以根據(jù)cochin 字體的特性,上面稍微將字體大小調(diào)整為 20,實(shí)際渲染出來(lái)的字母才是 16x16 左右大小,數(shù)字大概是 10x16,所以設(shè)置數(shù)字的 x,y 為 -5,-8,結(jié)合下面兩個(gè)屬性解釋 x,y 的計(jì)算方式。
translate: 設(shè)置文本的橫縱向偏移值。
rotate:設(shè)置文本旋轉(zhuǎn),單位 degrees。根據(jù) gravity 的設(shè)置坐標(biāo)系統(tǒng)有一丁點(diǎn)變化,所以請(qǐng)?jiān)O(shè)置為 西北(NorthWest) ,表示以畫布 0,0 坐標(biāo)旋轉(zhuǎn),跟 HTML 5 Canvas 坐標(biāo)系統(tǒng)一致。
根據(jù)這樣的坐標(biāo)系統(tǒng),如果要文字按自身的中心旋轉(zhuǎn),得配合 translate 和 text 的 x,y 一起使用,原理可參考這篇文章[圖像旋轉(zhuǎn)的實(shí)現(xiàn)],注意 translate 與 rotate 的順序。
strokewidth:設(shè)置文本的邊框?qū)挾然蚓€條寬度。
stroke:設(shè)置文本的邊框顏色或線條顏色。
-fill "rgba(0, 0, 0, 0)":上面設(shè)置了文本的填充顏色,會(huì)影響下面的貝塞爾曲線,所以這里指定一個(gè)透明的填充色以覆蓋上面的設(shè)定,使曲線沒(méi)有填充。
bezier:繪制貝塞爾曲線,一兩句話我怕解釋不清楚,所以請(qǐng)大家參考一下維基百科的解釋或者這篇中文文章的解釋,最后再參考一下 IM 官方示例的描述。上面兩條三次貝塞爾曲線的坐標(biāo)分別表示 起始點(diǎn),起始點(diǎn)的控制點(diǎn),結(jié)束點(diǎn)的控制點(diǎn),結(jié)束點(diǎn)。
+noise:增加噪點(diǎn),可以使用 convert -list noise 查看當(dāng)前系統(tǒng)支持哪些算法的噪點(diǎn),大概有 Gaussian, Impulse, Laplacian, Multiplicative, Poisson, Random, Uniform。
4、克隆及拼合圖像這個(gè)案例主要了解幾個(gè)基本操作的 API。
convert ( -crop 300x300+10+25 joy.jpg ) ( -resize 400x400 -crop 300x300+50+0 logo: ) -swap 0,1 +append ( -clone 0 -flop -flip ) -append -resize 200x200 combined.jpg
結(jié)果如下:
解釋:
圓括號(hào) ( ... ):圖像堆棧 ( image stack ),相當(dāng)于創(chuàng)建了一個(gè)獨(dú)立作用域處理圖像,這個(gè)可以使圖像之前的處理互不干擾。圓括號(hào)需用反斜杠轉(zhuǎn)義,才能不被 Shell 當(dāng)做特殊字符處理,并且每個(gè)圓括號(hào)兩邊需要用空格隔開(kāi)。不必要的圓括號(hào)會(huì)使 IM 增加少許額外的工作,但是卻讓命令更清晰不容易出錯(cuò)。
-crop:裁剪出圖像的一個(gè)或多個(gè)矩形區(qū)域,格式為 {size}{+-}x{+-}y,如果不指定偏移值 x,y,則會(huì)被解釋為按指定寬高切割圖像成多少份(多圖像)。
logo::IM 內(nèi)置圖像,這個(gè)就是上圖中拿著魔法棒的主人公了,本身寬高 640x480,其他內(nèi)置圖像還有:rose:,granite :等,看這里。
-swap:
交換圖像的位置,格式 -swap index,index。
IM 在圖像處理操作時(shí),實(shí)際上很可能是在處理一個(gè)圖像列表,當(dāng)新圖像被讀入或者創(chuàng)建時(shí),IM 會(huì)將該新圖像添加到當(dāng)前圖像列表的末尾。
如上,本來(lái)我們的圖像列表里有 2 張圖,第一張是 joy,但是 -swap 0,1 的意思是交換第一張圖與第二張圖的位置,所以 joy 變成跑到后面了。
+append:水平連接當(dāng)前圖像列表的圖像來(lái)創(chuàng)建單個(gè)較長(zhǎng)的圖像。
-append:垂直連接當(dāng)前圖像列表的圖像來(lái)創(chuàng)建單個(gè)較長(zhǎng)的圖像。
-clone:克隆圖像,格式為 -clone {index_range_list}。
-clone 0:表示克隆圖像列表里的第一張圖像。
-clone 1-2:表示克隆圖像列表里的第二張到第三張圖像。
-clone 0--1:0 表示第一張圖像,-1 表示最后一張圖像,所以整句命令則表示克隆整個(gè)圖像列表。
-clone 2,0,1:表示克隆第三張,第一張,第二張圖像,順序根據(jù)指定的索引決定,用逗號(hào)分隔。
-flop:將圖像水平翻轉(zhuǎn)。
-flip:將圖像垂直翻轉(zhuǎn)。
筆記:
選項(xiàng)之間的順序很重要。
與 -clone 雷同的選項(xiàng)還有諸如:-delete, -insert, -reverse, -duplicate,用于操作圖像列表,功能與單詞意思相同。
5、GIF 與圖片互轉(zhuǎn) 5.1、GIF 轉(zhuǎn)圖片convert -coalesce rain.gif frame.jpg
-coalesce:根據(jù)圖像 -dispose 元數(shù)據(jù)的設(shè)置覆蓋圖像序列中的每個(gè)圖像,以重現(xiàn)動(dòng)畫序列中每個(gè)點(diǎn)的動(dòng)畫效果。下面用一張結(jié)果對(duì)比圖來(lái)解釋這句話。
原始圖 ( rain.gif ) :
結(jié)果對(duì)比:
5.2、定義輸出文件名上面默認(rèn)輸出的文件名為:frame-0.jpg, frame-1.jpg, frame-2.jpg ...,
如果想使用下劃線作為符號(hào),輸出為 frame_0.jpg, frame_1.jpg, frame_2.jpg ...,則可以如下設(shè)置。
convert -coalesce rain.gif frame_%d.jpg
或者
convert -coalesce -set filename:n "%p" rain.gif "frame_%[filename:n].jpg"
解釋:
第一種方式 %d 是 C 語(yǔ)言 printf() 中表示輸出一個(gè)整數(shù),參考 -adjoin 選項(xiàng)。
第二種為常規(guī)方式。
-set:設(shè)置圖像屬性,格式為 -set key value
filename:n "%p":以 filename: 開(kāi)頭的 key 用于設(shè)置輸出文件名的相關(guān)信息,如這里使用 filename:n,在輸出文件名時(shí),則可以使用 %[filename:n] 拿到剛剛的設(shè)置,而設(shè)置的內(nèi)容則是 "%p"。"%p" 表示圖像在圖像列表中的索引值,更多百分比選項(xiàng) ( Percent Escapes ) 參考。
5.3、解析特定幀如果只想拿到 GIF 的第一幀,可以這樣設(shè)置。
convert -coalesce "rain.gif[0]" first_frame.jpg
拿到某些幀,如同 -clone 的寫法。
convert -coalesce "rain.gif[0-2]" some_frames_%d.jpg5.4、獲取頁(yè)數(shù)
通過(guò) identify 命令我們可以簡(jiǎn)要得到文件的信息,如下。
identify rain.gif
通過(guò)換行符分割,簡(jiǎn)單封裝一個(gè) Node.js 函數(shù)獲取頁(yè)數(shù)。
// parser.js const util = require("util") const exec = util.promisify(require("child_process").exec) exports.numberOfPages = async (filePath) => { try { const { stdout } = await exec(`identify "${filePath}"`) return stdout.trim().split(" ").length } catch (err) { throw new Error(err) } }
// main.js const { numberOfPages } = require("./parser") ;(async function start () { const pages = await numberOfPages("rain.gif") console.log("pages:", pages) }())5.5、圖片轉(zhuǎn) GIF
convert -loop 0 "frame-*.jpg" rain_animation.gif
將所有與 frame-*.jpg 模式匹配的圖像轉(zhuǎn)換成一張 GIF 圖像,如 frame-0.jpg,frame-1.jpg等。
-loop 設(shè)置動(dòng)畫循環(huán)次數(shù),0 表示無(wú)限循環(huán)。
設(shè)置每張圖像的播放速度可以使用 -delay 選項(xiàng)。
筆記: 在 IM 讀取系列文件時(shí),frame-10.jpg 會(huì)排在 frame-2.jpg 前面,為獲得圖像正確的讀取順序,可以為文件名設(shè)置前導(dǎo)零 ( leading zeros )。如:frame-000.jpg, frame-001.jpg, frame-002.jpg ... frame-010.jpg。
所以在生成圖像時(shí),我們可以使用 %03d 獲得三位前導(dǎo)零。
convert -coalesce rain.gif frame-%03d.jpg6、PDF 與圖片互轉(zhuǎn)
PDF 與圖片互轉(zhuǎn)跟 GIF 很相似,稍微有些格式自身需要注意的區(qū)別。
IM 本身是不具備解析 PDF 的功能的,需要依賴專門解析這種格式的外部程序,如官方指明的 ghostscript 解析程序。
首先安裝 gs,還是演示 Mac OS 安裝:brew install ghostscript。
以 這個(gè)PDF 為例,把它轉(zhuǎn)換成圖片,有兩種方式達(dá)到我們想要的結(jié)果:
① convert -density 150 -flatten "download.pdf[0]" first_page.jpg
② convert -density 150 -background white -alpha remove download.pdf download.jpg
解釋:
當(dāng)轉(zhuǎn)換 PDF 成 JPG 格式圖像時(shí),某些情況得到的 JPG 圖片會(huì)出現(xiàn)黑色背景(轉(zhuǎn)換成 PNG 不會(huì)),所以可以使用 -flatten 選項(xiàng)讓其保持白色背景,但加上這個(gè)選項(xiàng),多頁(yè) PDF 不會(huì)分成多個(gè) JPG 圖像,第二種方式 -background white -alpha remove 則可以一次命令轉(zhuǎn)換多頁(yè) PDF 成多個(gè)圖像并保持白色背景。
第二種方式 IM 內(nèi)部應(yīng)該是一頁(yè)一頁(yè)的轉(zhuǎn)換,所以一個(gè) 10 頁(yè)的 PDF 耗時(shí)會(huì)比較久,采用第一種方式讓 Node.js 多進(jìn)程同時(shí)轉(zhuǎn)換該 PDF 可以提升速率。
-density:指定輸出圖像的分辨率 ( DPI ),在 Mac OS 上,默認(rèn)的分辨率 ( 72 ) 輸出的圖像字跡不清,需要更高分辨率獲得清晰的圖像。
在 Node.js 中應(yīng)用直接通過(guò) child_process 模塊執(zhí)行相應(yīng)的命令即可,如下。
只需要結(jié)果可以使用 exec,
const util = require("util") const exec = util.promisify(require("child_process").exec) ;(async function start () { try { await exec(`convert -resize "150x100!" -strip goods.jpg thumbnail.jpg`) console.log("convert completed.") } catch (err) { console.log("convert failed.", err) } }())
流式輸入輸出可以使用 spawn,
const cp = require("child_process") const fs = require("fs") const args = [ "-", // 使用標(biāo)準(zhǔn)輸入 "-resize", "150x100!", "-strip", "jpg:-", // 輸出到標(biāo)準(zhǔn)輸出 ] const streamIn = fs.createReadStream("/path/to/goods.jpg") const proc = cp.spawn("convert", args) streamIn.pipe(proc.stdin) proc.stdout.pipe(HttpResponse)最后
本文同步發(fā)表于【凹凸實(shí)驗(yàn)室】博客及微信公眾號(hào),歡迎關(guān)注我們,么么噠。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108039.html
摘要:相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引??梢允褂幂p松生成圖表直方圖功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫(kù)。動(dòng)畫使用一組固定的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動(dòng)畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...
摘要:相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引??梢允褂幂p松生成圖表直方圖功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫(kù)。動(dòng)畫使用一組固定的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動(dòng)畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...
摘要:兩種最常用的圖片處理工具或,是的分支,這兩個(gè)圖片處理工具功能基本相同,各有特色。但他們并不是的插件,它們都是客戶端軟件,和版的都有。在中有一個(gè)插件叫,它完成了對(duì)上述兩個(gè)工具的封裝,使用的方式調(diào)用。 兩種最常用的圖片處理工具:GraphicsMagick 或 ImageMagick,GM是IM的分支,這兩個(gè)圖片處理工具功能基本相同,各有特色。但他們并不是nodejs的插件,它們都是客戶端...