我有一堆掃描成 jpg 格式的圖片。如下圖所示,卡片是雙面的,掃描時我在掃描器內放置了 6 張卡片。
下圖第一張牌的正面編號為1,背面編號為7。
我想要完成的任務:要分割這些檔案(image1.jpg 和 image2.jpg),我將有一個按以下順序包含各個卡片的資料夾:
1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg)
3.jpg(2)
4.jpg(8)
etc
1-如何使用 imagemagick (或任何其他解決方案)根據這些分隔線分割影像? (我可以獲得這些線的 x 和 y,因為所有圖像都是 2550x3507)
- 在分割後或分割期間,是否可以根據上述所需順序自動對它們進行編號?
答案1
如何使用 [ImageMagick? ] 根據這些分隔線分割影像?
可以說,最簡單的解決方案可能是使用-莊稼像這樣:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg
這個命令:
將每個影像分成 6 個(大致)大小相等的圖塊 (-裁切 3x2@),依序對每一項進行編號。
從
1
(-場景1), 而不是0
。在單一數字 [ ] 中為最終數字加上
0
-padding ( ) 。%02d
01-09
命令註釋
雖然可以為平鋪裁切指定確切的尺寸(例如
1000x1000
)或使用百分比(例如),但這也可能會產生「修剪」影像(可能是不可取的)。33%x50%
使用eg
-3x2@
通常會創建尺寸(相對於彼此)比“過衝”百分比(例如33.4%x50%
)更接近的圖像,以避免產生“修剪”圖像。在批次檔中,您需要將百分號加倍才能使其按預期工作:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
如果您正在寫入可以具有圖像/畫布偏移的格式(例如
.png
),您可能想要包含+重新翻頁在你之後-crop
:convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
+repage
如果您的輸入格式可以包含影像/畫布偏移,您可能也需要這些。
重新命名
是否可以依照上述順序自動編號?
單獨使用 ImageMagick,我無法做到這一點(我懷疑這可能是不可能的,但老實說我對此並不確定)。當然,脫離ImageMagick,這是完全可能的。
既然您已經用 標記了這個問題batch
,值得一提的是我可能無法幫助批量提供任何好的解決方案。考慮到這一點,您(或其他人)很可能能夠想出比我下面詳細介紹的更好的東西。
強制性批次(非)答案
透過批量重命名是可能的。首先,暫時重新命名每個檔案(第一個和最後一個除外),例如:
rename cropped_02.jpg cropped_02_temp.jpg
[...]
rename cropped_11.jpg cropped_11_temp.jpg
然後將它們重新命名回新位置,例如:
rename cropped_02_temp.jpg cropped_03.jpg
rename cropped_03_temp.jpg cropped_05.jpg
rename cropped_04_temp.jpg cropped_07.jpg
rename cropped_05_temp.jpg cropped_09.jpg
rename cropped_06_temp.jpg cropped_11.jpg
rename cropped_07_temp.jpg cropped_02.jpg
rename cropped_08_temp.jpg cropped_04.jpg
rename cropped_09_temp.jpg cropped_06.jpg
rename cropped_10_temp.jpg cropped_08.jpg
rename cropped_11_temp.jpg cropped_10.jpg
Batch 能夠從命令列取得參數並進行數學運算,以及擁有for
循環和if
語句等,因此該解決方案(顯然)可以改進。
重新命名註釋
如果您查看上面重命名過程的後半部分,您會注意到檔案名稱中的模式。實際上,對於給定的位置 N,我們可以使用以下兩個公式之一來找到項目在方案中的新位置:
- 直到「中間」點的項目(例如 2-6):
(Position_N * 2) - 1
- 超出「中間」點的項目(例如 7-11):
(Position_N * 2) - Total_Items
注意:雖然可以將這些公式應用於整個序列(例如 1 和 12),但第一個和最後一個項目永遠不會改變位置。這可以說使得沒有必要重命名它們。
此外,這些應該適用於任何甚至(非奇數)項目/位置的數量(4 或更多),假設您的檔案名稱按順序排列(例如 1 到 12)。所以對於你原來的例子:
Temp Item 2 becomes (2 * 2) - 1 = Item 3
Temp Item 7 becomes (7 * 2) - 12 = Item 2
Temp Item 8 becomes (8 * 2) - 12 = Item 4
[...]
因此,給出的公式可能是批次(或其他腳本)解決方案的基礎。但是,如果您決定這樣使用它們,還有其他一些事情需要注意...
排序
排序(如上所述)可能會對腳本等內容產生實際影響,因為 Windows「無序」傳回的項目將「破壞」給定的公式。特別:
Windows 對名稱進行排序字典編纂的預設順序。這意味著
0
前面沒有個位數的項目(例如image_1.jpg與圖片_01.jpg) 由 Windows 直接返回時,不會依(自然)順序出現。也就是說,它們將返回為例如:cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
檔案名稱中的某些單字和短語(例如
- Copy
)也會影響檔案名稱返回的順序。
如果您使用上面的公式,請確保0
在檔案名稱中填入單位數字並刪除類似內容- Copy
(或採取其他措施來緩解這些問題)。
從 0 開始的循環/計數器
如果您使用的語言以 開始計數0
(例如,在循環中),那麼這可能會稍微改變公式:
- 直到「中間」點(例如 1-5)的項目:
(Position_N * 2)
- 超出「中間」點的項目(例如 6-10):
(Position_N * 2) - (Total_Items - 1)
請記住,從 0 開始計數,將運行 12 項0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
。
Python 腳本
如果你有興趣,我寫了一篇小文章,(可能很糟糕)Python腳本對於 Python 3.x(使用 3.6.4 進行測試),可以從命令列使用它來重命名按順序排列的任意檔案(例如裁切_01.jpg…裁切_XX.jpg)按照您的問題中指定的順序。您將需要有一份Python的副本如果您決定嘗試一下,請安裝。
限制
不從文字檔案讀取資訊(因此此時不指定檔案清單)。同樣,命令列需要圖像/文件名前綴和擴展名。
照原樣,腳本期望檔案名稱會自動以正確的順序返回(請參閱
0
上面的 Windows 和 -padding)。如果您的專案未填充,可以選擇使用名為
natsort
(使用例如安裝)的第三方模組。但是,您需要在安裝後取消腳本中第 13 行 ( ) 和第 105 行 ( ) 的註解才能使用此選項。python -m pip install natsort
0
from natsort import natsorted
item_list = list(natsorted(item_list))
natsort
需要明確的是,「取消註解」意味著刪除#
行首的前導空格。腳本中包含有關使用的附加說明。