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

5

针对单个文件,我使用以下ImageMagick命令(如Google 建议所示):

对于png格式

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

但我需要对子文件夹中的所有 .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  
...

我该如何批量覆盖原始文件?即使我们有多个子目录:
/img/dir-1/one.jpg  
...  
/img/dir-2/foo.jpg  

遍历目录并执行命令行。我更喜欢使用Python。 - Kinght 金
@ausk 我正在使用Linux,对于使用命令行的经验不是很丰富。 - Toni Michel Caubet
2个回答

8

如果你想覆盖目录中的所有文件,可以使用 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 ...

我将最后一位改为 */*.png,这样它就可以处理子文件夹(一层)中的所有图像。 - Toni Michel Caubet

0

尝试这个:

(1) 另存为 cvt.py

(2) 打开终端,运行 python3 cvt.py 你的图片根目录路径


注意:以下代码可能会直接修改您的图像,请先进行测试。
#!/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)

请原谅我的无知。我假设我需要将它放入一个文件中。它应该有什么扩展名,如何执行它?谢谢。 - Toni Michel Caubet
我遇到了这个错误:"Traceback (most recent call last): File "cvt.py", line 31, in <module> root_path= sys.argv[1] NameError: name 'sys' is not defined" 有什么想法吗? - Toni Michel Caubet
对不起,我忘记添加 import sys,请看我的更新。 - Kinght 金
我已经添加了它,现在没有触发任何错误,但我没有看到任何文件被更改/创建。 - Toni Michel Caubet
再次更新调试信息。尝试查看任何输出信息? - Kinght 金

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接