有沒有一種linux指令可以一步批次優化多個影像檔?

有沒有一種linux指令可以一步批次優化多個影像檔?

我的資料夾中有一堆圖像:

images/image1.jpg
images/image2.jpg
...

這些圖像未針對網路進行最佳化。

只是想知道是否有一個 Linux 命令可以一步批量優化這些映像?

更新:我需要為每個圖像做兩件事:

  1. 如果影像的寬度高於 900px,則將寬度減小到 900px(保持比例)

  2. 以較低品質儲存文件,假設為原始品質的 70%。

答案1

安裝圖像魔術師:

sudo apt-get install imagemagick

並使用convert指令如下:

mkdir new
for file in images/*jpg
do convert -quality 70% -resize '>900x' "$file" new/$(basename "$file")
done

答案2

如果您有大量文件,並且希望快速完成此操作,您也可以使用並行程序:

sudo apt install imagemagick parallel

然後是以下內容:

find . \( -name '*.jp*g' -o -name '*.png' \) -a ! -name '*.min.*' -type f -print0 | \
parallel -0 'convert {} -resize '>900x' -quality '70%' \
    -set filename:newname "%d/%[basename].min.%[extension]" "%[filename:newname]"'

讓我們來看看:

  • find-- 尋找文件
    • .-- 在目前目錄下
    • \( -name '*.jp*g' -o -name '*.png' \)-- 可以是 png 或 jpeg(「jpg」和「jpeg」都是常見的副檔名!)
    • -a ! -name '*.min.*'-- 並且跳過已經最小化的文件
    • -type f-- 是實際文件,而不是符號連結或名稱奇怪的目錄
    • -print0-- 列印這些檔案並用空位元組分隔(這樣空格就不會破壞東西)
  • parallel-- 讀取前一個命令並為每個元素並行執行此命令
    • -0-- 每個元素以空位元組分隔
    • convert {}-- 使用替換的檔案名稱呼叫 imagemagick「轉換」程序{}
      • resize '>900x' -quality '70%'-- 將影像大小調整為 x 軸上的最大 900 像素,並將 jpeg 品質變更為 70%。許多其他可能的選項在這裡。
      • -set filename:newname "%d/%[basename].min.%[extension]"-- 使用新檔案名稱建立一個變數。請參閱文件以了解所有有效值
        • %d-- 檔案所在的目錄
        • %[basename]-- 不含任何副檔名的檔名
        • %[extension]-- 檔案的原始副檔名
      • "%[filename:newname]"-- 我們在上一步設定的輸出檔名

相關內容