我從命令列運行它:
magick.exe input.png -shave '1x0' output_%d.png
magick.exe input.png -shave '2x0' output_%d.png
magick.exe input.png -shave '3x0' output_%d.png
magick.exe input.png -shave '4x0' output_%d.png
magick.exe input.png -shave '5x0' output_%d.png
magick.exe input.png -shave '0x1' output_%d.png
magick.exe input.png -shave '0x2' output_%d.png
magick.exe input.png -shave '0x3' output_%d.png
magick.exe input.png -shave '0x4' output_%d.png
magick.exe input.png -shave '0x5' output_%d.png
第一個命令創建output_0.png但以下命令覆寫相同的檔案。是否有一個可以生成的命令output_0.png來output_9.png代替?
ImageMagick 檔案說:
檔案名參考
或者,使用嵌入的格式字符來撰寫順序影像串列。假設我們的輸出檔案名是 image-%d.jpg 并且我們的影像串列包含 3 張影像。您可以期望寫入這些影像檔案:
image-0.jpg image-1.jpg image-2.jpg
這是我發現在 ImageMagick 中可以做我正在尋找的事情的最接近的證據。我不清楚我是否需??要利用 shell 腳本來執行此操作,或者 ImageMagick 是否提供了命令列功能。
uj5u.com熱心網友回復:
使用 ImageMagick,您可以在單個命令中對輸入影像的不同實體運行多個操作,方法是克隆輸入并隔離括號內的操作,如下所示......
magick input.png \
\( -clone 0 -shave '1x0' \) \
\( -clone 0 -shave '2x0' \) \
\( -clone 0 -shave '3x0' \) \
\( -clone 0 -shave '4x0' \) \
\( -clone 0 -shave '5x0' \) \
\( -clone 0 -shave '0x1' \) \
\( -clone 0 -shave '0x2' \) \
\( -clone 0 -shave '0x3' \) \
\( -clone 0 -shave '0x4' \) \
\( -clone 0 -shave '0x5' \) \
-delete 0 output_d.png
這將創建 10 個輸出影像,每個影像都有一個順序檔案名,數字填充到兩個位置,例如“output_00.png ... output_10.png”。
要將其轉換為 Windows CMD 語法,您可以洗掉所有轉義括號的反斜杠,并將續行的反斜杠“\”替換為插入符號“^”。
編輯添加:有很多方法可以使用 ImageMagick 完成此任務。這是另一個產生相同結果的示例命令,但它使用 FX 運算式,因此它只能在 IMv7 中作業。(通過將“magick”更改為“convert”,上述命令應該與 IMv6 一起使用。)
magick input.png -duplicate 9 -shave "%[fx:t<5?t 1:0]x%[fx:t>4?t-4:0]" output_d.png
這會讀取輸入并將其復制 9 次,然后使用 FX 運算式作為-shave操作的引數,因此它可以逐步遍歷所有 10 個影像,并根據 FX 運算式中的公式對每個影像進行剃須。
uj5u.com熱心網友回復:
正如@GeeMack 指出的那樣, ImageMagick有很多方法可以做到這一點,我受到他奇妙的FX 運算式的啟發,嘗試了其他幾種方法——只是為了好玩!
這是我最初提出的建議:
magick input.png -write MPR:orig \
-shave 1x -write out_1.png \
-shave 1x -write out_2.png \
-shave 1x -write out_3.png \
-shave 1x -write out_4.png \
-shave 1x -write out_5.png \
-delete 0--1 \
MPR:orig \
-shave x1 -write out_6.png \
-shave x1 -write out_7.png \
-shave x1 -write out_8.png \
-shave x1 -write out_9.png \
-shave x1 out_10.png
它加載輸入影像并將副本保存在名為. 然后它從左側和右側刮掉一個像素并寫入,然后從左側和右側刮掉另一個像素并保存并繼續,直到左側和右側刮掉 5 個像素。然后,它從 MPR 重新加載原件并刮掉頂部和底部五次。origout_1.pngout_2.png
對于 1080p 影像,即 1920x1080,這需要 3.4 秒并使用 96MB 的 RAM。相比之下,GeeMack 在我的機器上需要 3.5 秒,并使用 291MB 的 RAM。
然后,我將左右剃須的創建與上下剃須并行化,如下所示:
magick input.png \
-shave 1x -write out_1.png \
-shave 1x -write out_2.png \
-shave 1x -write out_3.png \
-shave 1x -write out_4.png \
-shave 1x out_5.png &
magick input.png \
-shave x1 -write out_6.png \
-shave x1 -write out_7.png \
-shave x1 -write out_8.png \
-shave x1 -write out_9.png \
-shave x1 out_10.png &
wait
這只需要 1.97 秒,峰值為 68MB 的 RAM。
我認為GeeMack 的解決方案在大多數情況下可能是最簡單和最簡潔的,但在某些情況下,這里的一些想法可能會有一些里程,即可能更大的影像。
如果有人對如何測量峰值 RAM 使用量感興趣,我使用了這個:
/usr/bin/time -l ./go
1.97 real 6.01 user 2.48 sys
68354048 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
10343 page reclaims
0 page faults
0 swaps
...
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507867.html
