基于PIL的图像压缩命令行工具

基于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()

使用方法:

  1. default:
python imgsmaller.py --path XXX.png 
  1. 进行JPG格式压缩:
python imgsmaller.py --path XXX.png --quality 85
  1. 按长宽比进行压缩
python imgsmaller.py --path XXX.png --resize 0.85

或按长宽比压缩到最大边长度

python imgsmaller.py --path XXX.png --resize 1000
  1. 同时使用两种压缩方式:
python imgsmaller.py --path XXX.png --quality 85 --reszie 0.85
  1. 压缩文件夹图片:
python imgsmaller.py --dir images --quality 85 --reszie 0.85
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值