Как использовать команду преобразования ImageMagick для всех изображений в подпапках - PullRequest
0 голосов
/ 15 мая 2018

Для отдельных файлов я использую следующие команды 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  

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Если вы хотите перезаписать все файлы в каталоге, используйте 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 ...
0 голосов
/ 15 мая 2018

Попробуйте это:

(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...