前言
有不少优秀的网站是做图像压缩的,虽然他们的压缩效果很好、操作也是傻瓜式,但在实际使用过程中存在一些问题:收费;图片上传速度受自身网速限制;处理完还要下载;总结起来就是还不能满足效率(懒)需求。。。
本文介绍基于Python的PIL库实现一个十分简单的图像压缩工具,并用pyinstaller将其打包成独立的可执行文件(.exe)。
PS: 核心代码就2行,一行图像读取,一行保存。因此,莫说大神,稍微熟悉点的小菜鸟们都可以绕行,别说在下浪费你们时间=谋财害命。
正文
完整代码
import os
import sys
from PIL import Image
# from tqdm import tqdm # 添加这个包可能会引起pyinstaller打包错误
in_dir = 'Inputs' # 存放待压缩图像的文件夹,需要自行按此设置的名字新建,并于代码在同一目录下
ou_dir = 'Outputs' # 输出结果所在文件夹,程序会自动新建
quality = 60 # 设置压缩后质量, 应设置为 1(worst)-95(best)的数值
def load_images():
if not os.path.exists(in_dir):
print('请新建待压缩图像文件夹,并命名为:“Inputs”!')
sys.exit(0)
names = os.listdir(in_dir)
return names
def tiny_images(names):
''' 压缩in_dir中的所有图像 '''
for name in names:
try:
img = Image.open(in_dir+'/'+name)
except OSError:
print('遇到不支持的图像格式(请使用常用图像格式:jpg, png, tiff, bmp 等等)')
sys.exit(0)
# 将图片格式统一为jpg(便于后续用途)
name = name.split('.')[0] + '.jpg'
# 压缩图像
img.save(ou_dir+'/'+name, 'JPEG', quality=quality, optimize=True)
# img.save(ou_dir+'/'+name, 'JPEG', quality=quality)
# 所以其实要实现图像压缩就是保存的时候保存为jpg, 并把quality设置的低些即可。
# 参数optimize可用可不用, 设置为true的话会自动选择最优压缩算法。
# 其实压缩算法以及封装在底层了, 不用我们劳心实现压缩的具体算法。
if __name__ == "__main__":
img_names = load_images()
if len(img_names) == 0:
print('待压缩图像文件夹中并没有文件哦!?')
sys.exit(0)
if not os.path.exists(ou_dir):
os.mkdir(ou_dir)
print('开始压缩图像,共%d个' % len(img_names))
tiny_images(img_names)
print('完成压缩!')
前言中也说了,里面核心代码就2行,读取和保存。不过为了程序的健壮、考虑使用者的粗心大意,还是为每一个可能引发报错的地方设置了相应的提示并让程序自行了断。
效果
本文与一些图片压缩网站对比:
| 方法 | 原始尺寸及大小 | 压缩后尺寸及大小 |
|---|---|---|
| 压缩图 (https://www.yasuotu.com/) | 1800x1200, 2.1MB | 1800x1200, 350.99KB |
| TinyPNG (https://tinypng.com/) | 1800x1200, 369.7KB | |
| 本程序 | 1800x1200, 270.8KB |
| 原图 | 压缩图 | TinyPNG | 本程序 |
|---|---|---|---|
![]() | 图像超过2M下载需要充值会员… | ![]() | ![]() |
就实验结果而言,我实在感受不到那些网站的优秀…使用本文方法设置压缩后质量quality=60的情况下,压缩率就比两个网站都好了,而且压缩后的图像都与原图几乎没有区别。
后来我测试了下如果quality=10,确实质量就明显下降了:
关于这点就不在此过多赘述了。
另外又测试了一张原图为3960x5000, 14.0MB的图像,用本文方法(quality=60)压缩后也只有 3960x5000, 1.3MB,质量同样没有明显变化。而且14M也远超TinyPNG的5M上限,无法与之对比。
打包
为了方便朋友使用,自然不能直接给代码,哪怕只有1行也麻烦。所以还是采用pyinstaller将其打包为独立可执行文件。
打包的工具也有不少,此处还是推荐使用pyinstaller。具体步骤参考网上的一篇文章《python程序怎么打包》
不过打包过程中可能会出现一些问题(尤其是在win10, anaconda环境下),但把报的错误复制百度即可,网上基本上都有针对此类问题的教程。
打包完成后,将需要进行压缩的图片放在名为“Inputs”的文件夹中,而exe文件和该文件放在同一目录下(平级),执行该exe文件即可得到压缩后的结果,使用起来还是相当方便的,速度也很快。
总结
最后想简单总结下影响图像大小(占电脑空间大小)的因素:
- 像素个数(即1280*720、1366*760等等像素尺寸决定了该图像到底有多少个像素)
- 位数(即8位、16位、32位色彩)
- 存储格式、压缩方法
1、2是最基本的,但是在1、2相同的情况下,就是存储格式、压缩方法影响该图像实际占多少电脑空间了。此处如果有错误还望指出,我对图像格式、压缩等并不了解。
本文介绍如何使用Python的PIL库创建一个简单的图像压缩工具,只需两行核心代码,可将图像压缩到高质量且体积小。通过对比,表明在quality=60时,压缩效果优于某些在线服务。此外,文章还讲解了如何使用pyinstaller将脚本打包成独立的.exe文件,方便用户使用。



571

被折叠的 条评论
为什么被折叠?



