基于PIL的命令行图像压缩工具
最近编写博客的过程中,使用了图床工具,当图片比较大的时候加载会比较慢,于是自己使用PIL编写了一套图像压缩工具,包括resize和jpg压缩两种模式,并编写为命令行格式,支持文件夹和图像文件两种处理方式,需要可以自取。
功能:
- 通过命令行调用;
- resize图像大小、压缩图像储存;
- 可以处理单个图像文件或文件夹全部图像;
# -*- coding: utf-8 -*-
# imgsmaller.py
# created: 2020-03-15T22:47:13.777Z+08:00
# last-modified: 2020-03-15T22:47:13.777Z+08:00
from PIL import Image
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument(
'--dir',
type=str,
default='',
help='if to process a dir'
)
parser.add_argument(
'--path',
type=str,
help='path of image'
)
parser.add_argument(
'--quality',
type=int,
default=90,
help='qulity of image'
)
parser.add_argument(
'--resize',
type=float,
default=0.9,
help='maxsize > 1 or 0 < resize ratio <= 1'
)
parser.add_argument(
'--nobigger',
type=bool,
default=True,
help='if do not resize for bigger'
)
def is_image(path):
if path.split('.')[-1].lower() in ['jpg','png', 'jpeg']:
return True
else:
return False
def resize_img(img, max_l, nobigger=False):
W, H = img.size
if max_l == 1 or (nobigger and max_l > max(H,W)):
return img
if max_l < 1:
ratio = max_l
else:
ratio = max_l / max(H, W)
imgout = img.resize((int(W * ratio), int(H * ratio)))
return imgout
def process(path, resize, quality, nobigger=False):
if not is_image(path):
print('path {} is not an image file!'.format(path))
return
image = Image.open(path)
image = resize_img(image, resize, nobigger)
end = path.split('.')[-1]
save_path = path.rstrip('.' + end) + '_small.' + end
quali = int(quality)
image.save(save_path, quality=quali)
def main():
args = parser.parse_args()
print(args.dir)
if len(args.dir):
files = os.listdir(args.dir)
for i, file in enumerate(files):
print('processing file :{}, \t \t ratio:{}/{}'.format(file, (i+1),len(files)))
process(args.dir + file, args.resize, args.quality, args.nobigger)
else:
process(args.path, args.resize, args.quality, args.nobigger)
if __name__ == "__main__":
main()
使用方法:
- default:
python imgsmaller.py --path XXX.png
- 进行JPG格式压缩:
python imgsmaller.py --path XXX.png --quality 85
- 按长宽比进行压缩
python imgsmaller.py --path XXX.png --resize 0.85
或按长宽比压缩到最大边长度
python imgsmaller.py --path XXX.png --resize 1000
- 同时使用两种压缩方式:
python imgsmaller.py --path XXX.png --quality 85 --reszie 0.85
- 压缩文件夹图片:
python imgsmaller.py --dir images --quality 85 --reszie 0.85