依給定比例分割 jpg 影像 (imagemagick)

依給定比例分割 jpg 影像 (imagemagick)

我有一堆掃描成 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

(image1.jpg) 六張卡片的正面: 卡片正面

(image2.jpg) 六張卡片的背面: 卡片背面

1-如何使用 imagemagick (或任何其他解決方案)根據這些分隔線分割影像? (我可以獲得這些線的 x 和 y,因為所有圖像都是 2550x3507)

分隔線為紅色: 分隔線為紅色

  1. 在分割後或分割期間,是否可以根據上述所需順序自動對它們進行編號?

答案1

如何使用 [ImageMagick? ] 根據這些分隔線分割影像?

可以說,最簡單的解決方案可能是使用-莊稼像這樣:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg

這個命令:

  • 將每個影像分成 6 個(大致)大小相等的圖塊 (-裁切 3x2@),依序對每一項進行編號。

  • 1(-場景1), 而不是0

  • 在單一數字 [ ] 中為最終數字加上0-padding ( ) 。%02d01-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 natsort0from natsort import natsorteditem_list = list(natsorted(item_list))natsort

需要明確的是,「取消註解」意味著刪除#行首的前導空格。腳本中包含有關使用的附加說明。

相關內容