如何对子文件夹中的所有图像使用ImageMagick convert命令

时间:2018-05-15 11:49:33

标签: linux image optimization imagemagick bulk

对于单个文件,我使用以下ImageMagick命令(如Google suggests):

对于png

re.sub(r',', ' ', text)

对于jpg

convert file.png -sampling-factor 4:2:0 -strip -quality 85 -interlace PNG -colorspace sRGB file.png

但我需要对子文件夹中的所有.jpg执行相同的操作

我试过了:

convert file.jpg -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace sRGB file.jpg

所有图像都经过压缩但以第一个带有附加索引的名称命名,例如:

find ./*.jpg | xargs convert $ -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace sRGB $

我怎么能批量覆盖原件呢?即使我们有多个子目录:

/img/first-one-0.jpg  
/img/first-one-1.jpg  
/img/first-one-2.jpg  
/img/first-one-3.jpg  
...

2 个答案:

答案 0 :(得分:4)

如果要覆盖目录中的所有文件,请使用mogrify

mogrify -sampling-factor 4:2:0 -strip -quality 85 -interlace PNG -colorspace sRGB *.png

如果您希望将结果写在名为processed的新子目录中:

mkdir processed
mogrify -path processed ...

如果您使用 ImageMagick v7或更新版本,则会变为:

mkdir processed
magick mogrify -path processed ...

答案 1 :(得分:0)

试试这个:

  

(1)另存为cvt.py

     

(2)打开终端,运行python3 cvt.py your_images_root_path

  

注意:以下代码可能会修改您的图像,首先进行测试。

#!/usr/bin/python3
# 2018/05/15 20:30:52
# 2018/05/15 20:41:04

## save as cvt.py
## run `python3 cvt.py your_images_root_path` in Terminal


import os
import sys 

def convert(fname): 
    _, ext = os.path.split(fname)
    ext = ext.upper()
    if ext in (".JPEG", ".JPG"):
        fname = "JPG"
    elif ext == ".PNG":
        fname = "PNG"
    else:
        return 
    cmd =  "convert {fname} -sampling-factor 4:2:0 -strip -quality 85 -interlace {} -colorspace sRGB {fname}".format(fname=fname, fmt=fmt)    
    os.system(cmd)

    ## Debug info 
    print(cmd)


def convert_in_dir(root_dir):
    assert os.path.exists(root_dir)
    for dpath, dnames, fnames in os.walk(root_dir):   
        fnames = [os.path.join(dpath, fname) for fname in fnames]
        for fname in fnames:
            convert(fname)

if __name__ == "__main__":
    root_path= sys.argv[1]
    convert_in_dir(root_path)