2015-06-05 15 views
1

我想從其他人創建一個圖像,這是convert操作自己的結果,而不會將中間結果保存到文件系統。ImageMagick:使用多個轉換結果編寫

龍解釋:

我有兩個圖像,這兩個需求的具體變換:

  • avatar.jpg需要被轉化爲一個圓形的圖像 - >圓角頭像。 jpg
  • background.jpg需要應用顏色層 - >color-back ground.jpg

然後我想dissolve四捨五入avatar.png有色background.jpg,讓我得到的東西看起來像這樣:

 
    +-----------+ 
    |  O  | 
    +-----------+ 

我到目前爲止:

我知道如何順序地進行這些操作(也許不是最好的方式,但這不是這個問題的主題),還送了我一個工作的bash腳本:

#!/bin/bash 

convert $1 -alpha set -background none -vignette 0x0 rounded-avatar.png 

convert $2 -auto-orient -thumbnail 600x313^ -gravity center -extent 600x313 -region 100%x100% -fill "#256997" -colorize 72% colored-background.jpg 

composite -dissolve 100 -gravity Center rounded-avatar.png colored-background.jpg -alpha Set $3 

,我可以

$ ./myScript.sh avatar.jpg background.jpg output.jpg 

調用它,我想要什麼:

我想避免的兩個臨時圖像的保存( rounded-avatar.jpg and colored-background.jpg)在文件系統上。

爲什麼?

  • 這個過程必須建立在一個網絡平臺自動跑,我不希望有處理併發這些臨時文件與命名技巧。
  • 當前的腳本使IM在內存中加載了兩次圖像,重新使用計算的圖像而不是將它們寫入磁盤然後將它們加載到新的進程中可能會更有效。
  • 這些天磁盤I/O很少,我們節省一些。

我希望我只是缺少合適的關鍵字來查找文檔中的答案。

我知道這可能似乎過度優化,我沒有在這裏與C10k問題掙扎,但我只是想做正確的(並理解IM語法)。

+0

能否請您提供您的輸入圖像以及在輸出你的腳本產生? –

回答

3

一種很難幫助沒有看到您的圖像!我想這會是這個樣子,但:

convert -gravity center         \ 
     \($1 -alpha set -background none -vignette 0x0)\ \ 
     \($2 -auto-orient -thumbnail 600x313^ -gravity center -extent 600x313 -region 100%x100% -fill "#256997" -colorize 72%)\ \ 
     -compose dissolve -composite result.jpg 

的顯着部分是

一),您可以用括號做「一邊處理」一個特定的圖像

b )您可以將2個或更多圖像加載到某種圖像堆棧上以便處理

c)您可以在設置01後使用convert命令的-composite運算符鍵入來代替實際的compose命令本身。

選項2

另一種選擇可以是用於多個圖像的MIFF格式和管這樣的:

convert \($1 .... \) \($2 ... \) miff:- | composite -dissolve 100 -gravity center - ... 

選項3

又一選擇是爲每個輸入文件分別使用convert,然後將連接結果發送到第三個convertcomposite這樣的:

(convert -size 100x100 xc:red miff:- ; convert -size 100x100 xc:blue miff:-) | convert - +append result.jpg 

其給出這樣的:

enter image description here

選項4

如果圖像需要被組合之前處理的顯著量,可以開發選項3,以便2個輸入圖像並行處理,像這樣

mkfifo fifo1 fifo2 2>/dev/null 
convert -size 2000x2000 xc:gray +noise gaussian -median 7 jpeg:fifo1 & 
convert -size 2000x2000 xc:gray +noise gaussian -median 7 jpeg:fifo2 & 
convert fifo1 fifo2 +append result.jpg  # or equally "convert fifo[12] ..." 

這需要33秒時,而下面的順序版本,需要64秒和頂部

convert -size 2000x2000 xc:gray +noise gaussian -median 7 1.jpg 
convert -size 2000x2000 xc:gray +noise gaussian -median 7 2.jpg 
convert 1.jpg 2.jpg +append result.jpg  # or equally "convert [12].jpg..." 
+0

這就是我一直在尋找的!我沒有意識到可以在圓括號內加載不同的圖像,因爲大多數例子都涉及'-clone'。 現在看起來很明顯:)。 只需對您的代碼片段進行2個小改動:放錯括號的反斜槓以關閉括號,並將堆棧中的兩個圖片顛倒以獲得所需的結果。謝謝。 – g4vroche