如何对子文件夹中的所有图像使用 ImageMagick 转换命令
How to use ImageMagick convert command for all images in subfolders
对于单个文件,我使用以下 ImageMagick 命令(如 google suggests):
对于 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
试试这个:
(1) Save as cvt.py
(2) Open terminal, run python3 cvt.py your_images_root_path
Notice: The following code may modify your images in place, test it first.
#!/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)
如果要覆盖目录中的所有文件,请使用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 ...
对于单个文件,我使用以下 ImageMagick 命令(如 google suggests):
对于 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
试试这个:
(1) Save as
cvt.py
(2) Open terminal, run
python3 cvt.py your_images_root_path
Notice: The following code may modify your images in place, test it first.
#!/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)
如果要覆盖目录中的所有文件,请使用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 ...