用 Python 批量压缩图片

掐指一算,跟着 Crossin 入门学完 python 基础后,我已经整整 4 年没写过 python 代码了。

上一篇关于 python 的博文还是 2013 年的 9 月 8 号,当时写了一个用python写的用命令行看糗百的小工具

前两天和 Crossin 聊天,发现他依然在做 python 相关的培训,做的已经风生水起了。就在刚刚,他公众号发了一篇文章「【每周一坑】缩小图片尺寸」,顿时手痒了,让我打开快在我电脑里面生锈的 pycharm 来实现它吧!

写一段 python 代码来压缩图片大小:

实现单张图片的压缩不难,所以附加题,将这段代码制作成一个命令行工具,使其可以:

  1. 指定要压缩的图片文件
  2. 如果指定的是一个目录,则压缩整个目录里的图片
  3. 指定压缩的比率
  4. 指定输出的文件路径
  5. 选择是否保留原始图片

下面是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!usr/bin/python
# coding:utf-8
from PIL import Image
import argparse
import os
# 获取用户输入参数:
parser = argparse.ArgumentParser()
parser.add_argument("path", help="文件或文件夹目录")
parser.add_argument("ratio", help="输入要压缩至的比率,例如:0.5", type=float)
parser.add_argument("-t", "--target_path", help="指定输出的文件路径")
parser.add_argument("-d", "--delete", help="输入任意英文字符删除原文件")
agrs = parser.parse_args()
path = agrs.path
# 压缩图片比率主体函数
def resize_pic():
# 获取要压缩的比率
ratio = agrs.ratio
pic_name = os.path.basename(pic_path)
# 制造新图片的文件名
new_name = pic_name.split(".")[0] + "_" + "new" + "." + pic_name.split(".")[1]
# 如果目标文件夹存在,则生成在指定目录
if agrs.target_path and os.path.isdir(agrs.target_path):
target_path = agrs.target_path + new_name
# 如果目标文件夹不存在,则生成在图片所在目录
elif not agrs.target_path:
target_path = os.path.dirname(pic_path) + "/" + new_name
else:
print("您所制定的输出文件路径不存在")
return
# 打开图片文件并获取图片长宽参数
image = Image.open(pic_path)
width, height = image.size
# 指定新图片的长宽数据
new_width = int(ratio * width)
new_height = int(ratio * height)
# 生成新图片,后面的 Image.ANTIALIAS 可以抗锯齿让图片变得更清晰
new_pic = image.resize((new_width, new_height), Image.ANTIALIAS)
new_pic.save(target_path)
if agrs.delete:
os.remove(pic_path)
# 如果用户给的是文件,则直接运行函数
if os.path.isfile(path):
pic_path = path
resize_pic()
# 如果给的是目录,则遍历后,运行函数
elif os.path.isdir(path):
for pic in os.listdir(path):
if not pic.startswith('.') and os.path.isfile(os.path.join(path, pic)):
pic_path = os.path.join(path, pic)
resize_pic()
else:
print(" 您所输入的文件或目录不存在")

使用及参数说明:

  1. 将代码存为 ratio.py 文件,用 python ratio.py path ratio 进行调用。
  2. python ratio.py 后面有两个必选参数,path 处要填写你要进行压缩的图片文件或文件夹目录,例如/Users/byron/Destop/pic.jpg/Users/byron/Destop/pics/ratio 处要填写要压缩至的比率,例如:0.5
  3. 再往后有两个可选参数:target_pathdelete
  4. target_path 用法:python ratio.py path ratio -t target_pathtarget_path 处填写你要指定输出的文件路径。
  5. delete 用法:python ratio.py path ratio -t target_path -d yes-d 后面输入任意英文字符可删除源文件。
  6. 注意参数之间的空格。
赞赏作者半杯摩卡