[自制]python批量压缩图像
背景
今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。这要是每一个照片都用ps压缩的话,那岂不是很崩溃。于是我写了一个脚本,可以批量压缩图片到指定大小。直接造福同事、提高同事的工作效率。
解决方案
其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停止压缩,如果没有达到指定大小,那就对压缩后的图片再进行压缩,直到压缩到自定范围内。
可是为什么不在网上找代码呢?我也是找过,但是发现很多代码质量参差不齐,都达不到我想要的效果,而且很不优雅。于是我随手就写了一个代码,不仅仅代码写的简单,而且逻辑清楚,最后为了效率,我还做了一个并行,同时使用10个进程处理。说实话,那可是真的飞快。
操作步骤
要求
- 默认是使用的是
Anaconda
的环境。 - 将所有要压缩的图片都放在一个文件夹下,然后每个图片的格式只能是下面三种:
png
,jpg
,jpeg
。如果是PNG
也不行。因为PNG
是png
的大写。 - 代码中设置的图像的压缩后的大小是
512KB
,那么你可以设置代码中的target_size
为500
,只要比512KB
小就行了。 - 然后把我的代码从GitHub上下载下来。代码链接为:https://github.com/yuanzhoulvpi2017/tiny_python/blob/main/image_compression/ic.py
步骤
- 我这里把所有图片都放在了一个文件夹里面,文件夹名称为
历史截图
。然后我的这个历史截图
和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 chainfrom 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_listdef imagesize(filepath):"""获得文件的磁盘大小:param filepath::return:"""return os.path.getsize(filepath) / 1024def 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 # kbtry:if imagesize(image_path) < target_size:shutil.copyfile(image_path, output_image)else:width, height = raw_image.sizeraw_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.sizetemplate_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')# parallelP = 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 inimage_file_list]_ = [res.get() for res in res_temp]
写在后面
这个代码说起来难,说起来也不难,如果认真看我历史的文章的话,上面代码中遇到的知识点都就会了。像是所谓的图像压缩、并行处理之类的,其实并不难。
[自制]python批量压缩图像相关推荐
- 【深度学习入门到精通系列】Python批量实现图像镜像翻转
''' Python批量实现图像镜像翻转 函数:DataAugment() 函数功能:扩大数据量 输入参数:dir_path----图片库路径 '''import cv2 import os impo ...
- php 批量压缩png,利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)...
前言 本文主要给大家介绍的关于Python批量压缩png的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 1.需求 为什么会有这个需求?是因为游戏的资源大多是png图片,需要 ...
- 使用Python批量压缩图片
使用Python批量压缩图片 Python脚本 #coding:utf-8 import Image import os import os.path def picIsCorrect(fileSuf ...
- Python批量压缩图片
Python批量压缩图片 代码如下 代码如下 可支持压缩指定单张图片,单个文件夹,多个文件夹,可根据自己实际场景的需求扩展丰富.话不多说,上代码. # @Time : 2021/10/14 9:16i ...
- 如何使用python批量压缩图片_python利用Guetzli批量压缩图片
Google 又开源了,这次开源了一款图像算法工具 Guetzli.Guetzli,在瑞士德语中是"cookie(曲奇)"的意思,是一个针对数码图像和网页图像的 JPEG 编码器, ...
- 如何使用python批量压缩图片_利用Python 批量压缩图片
方法一 直接调整宽高 先放参考资料:如何用Python智能批量压缩图片? import math from glob import glob from PIL import Image import ...
- 如何使用python批量压缩图片_python 实现图片批量压缩的示例
项目中大量用到图片加载,由于图片太大,加载速度很慢,因此需要对文件进行统一压缩 一:导入包 from PIL import Image import os 二:获取图片文件的大小 def get_si ...
- python批量压缩图片_Python图片批量压缩到指定大小并将JPG转为PNG格式
背景: 待压缩的图片大小有几十KB到近10M大小不等,且绝大部分图片为JPG格式.这些待压缩图片放在picture文件夹下 以及picture文件夹下的子文件夹中 现需要将picture文件夹下这些图 ...
- 基于python批量调整图像大小
前言 在写论文的时候常常因为截图的尺寸大小不一样,导致图片排版很难受,在word中又不会批量修改,用下面的代码可以批量处理修改成一样的尺寸哦! 代码如下: 在本文中,我将向你展示如何使用Pytho ...
- Python批量压缩图片大小并保存到相应的新文件夹,不覆盖源文件
网上下载的小姐姐套图合集因为原图非常大,一张图十几或者几十M,一套图下来总共可能上百G,所以需要批量压缩处理一下,虽然PS也可以办到,但是代码更灵活,写个Python程序处理了一下,讲每张图长宽缩为2 ...
最新文章
- 小米豪派大红包!向几千名员工发放股权激励,人均39万,应届生都有!小米员工却吵翻天:不公平,作秀!...
- java数组的协变_Java数组协变与范型不变性
- 防止******ADSL的一些技巧
- Redis集群研究和实践(基于redis 3.0.5)
- windows端口查看及进程查找
- 学生电脑哪个牌子好_面包冷藏车哪个牌子好
- dart系列之:和null说再见,null使用真实实践
- Django_form补充
- HDU 4279 - Number
- Java 目录操作二(获取文件的上级目录、获取目录最后修改时间、打印目录结构、遍历指定目录下的所有目录)
- Linux 线程池的概念与实现
- 网工常用网络命令合集✨(建议收藏)
- XL4001 典型应用电路
- 2022hgame-week1 wp
- CellType 及 CELL_TYPE_BLANK
- 京东笔试编程题之方块消除
- Java字符串格式化详解
- 读书笔记(VI) 少有人走的路
- 在史蒂夫传中寻找现实扭曲力场1
- 在线画图工具-CCA与RDA分析_圈圈Bio_新浪博客