Python怎样进行批量压缩图像,具体操作是怎样
Admin 2022-05-28 群英技术资讯 873 次浏览
在实际应用中,我们有时候会遇到“Python怎样进行批量压缩图像,具体操作是怎样”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Python怎样进行批量压缩图像,具体操作是怎样”文章能帮助大家解决问题。今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。这要是每一个照片都用ps压缩的话,那岂不是很崩溃。于是我写了一个脚本,可以批量压缩图片到指定大小。直接造福同事、提高同事的工作效率。
其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停止压缩,如果没有达到指定大小,那就对压缩后的图片再进行压缩,直到压缩到自定范围内。
可是为什么不在网上找代码呢?我也是找过,但是发现很多代码质量参差不齐,都达不到我想要的效果,而且很不优雅。于是我随手就写了一个代码,不仅仅代码写的简单,而且逻辑清楚,最后为了效率,我还做了一个并行,同时使用10个进程处理。说实话,那可是真的飞快。
我这里把所有图片都放在了一个文件夹里面,文件夹名称为历史截图。然后我的这个历史截图和ic.py代码都放在了little_code文件夹中。

在little_code文件夹下,打开终端。

直接运行的脚本:
python ic.py xxx_文件夹
等待一会,就会将整个文件夹下的所有图片都转化好了。

完整代码:
如果上不去GitHub的话,我直接把代码放在这里,保存为一个python文件即可。比如保存的文件名为:ic.py
from PIL import Image
from glob import glob
import os
from tqdm import tqdm
import shutil
import sys
from itertools import chain
from multiprocessing import Pool
# image_dir = "image_dir"
template_dir = 'template'
output_dir = 'output'
error_dir = 'error'
def clean_dir(dir_name):
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
os.makedirs(dir_name)
else:
os.makedirs(dir_name)
# image_file_list = glob(f"{image_dir}/*")
# image_file_list
def imagesize(filepath):
"""
获得文件的磁盘大小
:param filepath:
:return:
"""
return os.path.getsize(filepath) / 1024
def compress_image(image_path):
raw_image = Image.open(image_path)
temp_image_name = image_path.split(os.sep)[-1]
template_image = os.path.join(template_dir, temp_image_name)
output_image = os.path.join(output_dir, temp_image_name)
error_image = os.path.join(error_dir, temp_image_name)
target_size = 500 # kb
try:
if imagesize(image_path) < target_size:
shutil.copyfile(image_path, output_image)
else:
width, height = raw_image.size
raw_image.resize((int(width * 0.9), int(height * 0.9)), Image.ANTIALIAS).save(template_image)
while imagesize(template_image) > target_size:
template_iamge2 = Image.open(template_image)
width_2, height_2 = template_iamge2.size
template_iamge2.resize((int(width_2 * 0.9), int(height_2 * 0.9)), Image.ANTIALIAS).save(template_image)
shutil.copyfile(template_image, output_image)
except Exception as e:
shutil.copyfile(image_path, error_image)
print(f'文件保存失败: {image_path}')
# print(e)
if __name__ == '__main__':
# 批量创建文件夹
[clean_dir(i) for i in [template_dir, output_dir, error_dir]]
image_dir = sys.argv[1]
image_file_list = list(chain(*[glob(os.path.join(image_dir, i)) for i in ['*.png', '*.jpg', '*.jpeg']]))
# for temp_image_path in tqdm(image_file_list):
# compress_image(temp_image_path)
print(f'\n\n文件保存父目录: {os.getcwd()}\n'
f'输出文件位置:{os.path.join(os.getcwd(), output_dir)}\n\n')
# parallel
P = Pool(processes=10)
pbar = tqdm(total=len(image_file_list))
res_temp = [P.apply_async(func=compress_image, args=(i,), callback=lambda _: pbar.update(1)) for i in
image_file_list]
_ = [res.get() for res in res_temp]
import os
from PIL import Image
# 源目录
project_dir = os.path.dirname(os.path.abspath(__file__))
input = os.path.join(project_dir, 'src')
# 输出目录
output = os.path.join(project_dir, 'dest')
def modify():
# 切换目录
os.chdir(input)
# 遍历目录下所有的文件
for image_name in os.listdir(os.getcwd()):
print(image_name)
im = Image.open(os.path.join(input, image_name))
im.thumbnail((128, 128))
im.save(os.path.join(output, image_name))
if __name__ == '__main__':
modify()
这个代码说起来难,说起来也不难,如果认真看我历史的文章的话,上面代码中遇到的知识点都就会了。像是所谓的图像压缩、并行处理之类的,其实并不难。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
大家好,本篇文章主要讲的是python配置虚拟环境步骤,感兴趣的同学赶快来看一看,对你有帮助的话记得收藏一下,方便下次浏览
这篇文章主要介绍了利用Python实现读取二进制文件,文章尝试使用Python中的内置open函数使用默认读取模式读取zip文件,下文详细介绍,需要的小伙伴可以参考一下
这篇文章介绍了Python中的文件系统模块pathlib库,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎,数据以 Region 为单位进行复制和管理,每个 Region 会有多个 Replica(副本),这些 Replica 会分布在不同的 TiKV 节点上,其中 Leader 负责读/写,Follower 负责同步 Leader 发来的 raft log。了解了这些信息后,请思考下面这些问题:
这篇文章主要介绍了Django csrf校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008