背景

今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。这要是每一个照片都用ps压缩的话,那岂不是很崩溃。于是我写了一个脚本,可以批量压缩图片到指定大小。直接造福同事、提高同事的工作效率。

解决方案

其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停止压缩,如果没有达到指定大小,那就对压缩后的图片再进行压缩,直到压缩到自定范围内。

可是为什么不在网上找代码呢?我也是找过,但是发现很多代码质量参差不齐,都达不到我想要的效果,而且很不优雅。于是我随手就写了一个代码,不仅仅代码写的简单,而且逻辑清楚,最后为了效率,我还做了一个并行,同时使用10个进程处理。说实话,那可是真的飞快。

操作步骤

要求

  1. 默认是使用的是Anaconda的环境。
  2. 将所有要压缩的图片都放在一个文件夹下,然后每个图片的格式只能是下面三种:png,jpg, jpeg。如果是PNG也不行。因为PNGpng的大写。
  3. 代码中设置的图像的压缩后的大小是512KB,那么你可以设置代码中的target_size500,只要比512KB小就行了。
  4. 然后把我的代码从GitHub上下载下来。代码链接为:https://github.com/yuanzhoulvpi2017/tiny_python/blob/main/image_compression/ic.py

步骤

  1. 我这里把所有图片都放在了一个文件夹里面,文件夹名称为历史截图。然后我的这个历史截图ic.py代码都放在了little_code文件夹中。

  1. little_code文件夹下,打开终端。

  1. 直接运行的脚本:
python ic.py xxx_文件夹

等待一会,就会将整个文件夹下的所有图片都转化好了。

  1. 完整代码:

如果上不去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批量压缩图像相关推荐

  1. 【深度学习入门到精通系列】Python批量实现图像镜像翻转

    ''' Python批量实现图像镜像翻转 函数:DataAugment() 函数功能:扩大数据量 输入参数:dir_path----图片库路径 '''import cv2 import os impo ...

  2. php 批量压缩png,利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)...

    前言 本文主要给大家介绍的关于Python批量压缩png的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 1.需求 为什么会有这个需求?是因为游戏的资源大多是png图片,需要 ...

  3. 使用Python批量压缩图片

    使用Python批量压缩图片 Python脚本 #coding:utf-8 import Image import os import os.path def picIsCorrect(fileSuf ...

  4. Python批量压缩图片

    Python批量压缩图片 代码如下 代码如下 可支持压缩指定单张图片,单个文件夹,多个文件夹,可根据自己实际场景的需求扩展丰富.话不多说,上代码. # @Time : 2021/10/14 9:16i ...

  5. 如何使用python批量压缩图片_python利用Guetzli批量压缩图片

    Google 又开源了,这次开源了一款图像算法工具 Guetzli.Guetzli,在瑞士德语中是"cookie(曲奇)"的意思,是一个针对数码图像和网页图像的 JPEG 编码器, ...

  6. 如何使用python批量压缩图片_利用Python 批量压缩图片

    方法一 直接调整宽高 先放参考资料:如何用Python智能批量压缩图片? import math from glob import glob from PIL import Image import ...

  7. 如何使用python批量压缩图片_python 实现图片批量压缩的示例

    项目中大量用到图片加载,由于图片太大,加载速度很慢,因此需要对文件进行统一压缩 一:导入包 from PIL import Image import os 二:获取图片文件的大小 def get_si ...

  8. python批量压缩图片_Python图片批量压缩到指定大小并将JPG转为PNG格式

    背景: 待压缩的图片大小有几十KB到近10M大小不等,且绝大部分图片为JPG格式.这些待压缩图片放在picture文件夹下 以及picture文件夹下的子文件夹中 现需要将picture文件夹下这些图 ...

  9. 基于python批量调整图像大小

    前言   在写论文的时候常常因为截图的尺寸大小不一样,导致图片排版很难受,在word中又不会批量修改,用下面的代码可以批量处理修改成一样的尺寸哦! 代码如下: 在本文中,我将向你展示如何使用Pytho ...

  10. Python批量压缩图片大小并保存到相应的新文件夹,不覆盖源文件

    网上下载的小姐姐套图合集因为原图非常大,一张图十几或者几十M,一套图下来总共可能上百G,所以需要批量压缩处理一下,虽然PS也可以办到,但是代码更灵活,写个Python程序处理了一下,讲每张图长宽缩为2 ...

最新文章

  1. 小米豪派大红包!向几千名员工发放股权激励,人均39万,应届生都有!小米员工却吵翻天:不公平,作秀!...
  2. java数组的协变_Java数组协变与范型不变性
  3. 防止******ADSL的一些技巧
  4. Redis集群研究和实践(基于redis 3.0.5)
  5. windows端口查看及进程查找
  6. 学生电脑哪个牌子好_面包冷藏车哪个牌子好
  7. dart系列之:和null说再见,null使用真实实践
  8. Django_form补充
  9. HDU 4279 - Number
  10. Java 目录操作二(获取文件的上级目录、获取目录最后修改时间、打印目录结构、遍历指定目录下的所有目录)
  11. Linux 线程池的概念与实现
  12. 网工常用网络命令合集✨(建议收藏)
  13. XL4001 典型应用电路
  14. 2022hgame-week1 wp
  15. CellType 及 CELL_TYPE_BLANK
  16. 京东笔试编程题之方块消除
  17. Java字符串格式化详解
  18. 读书笔记(VI) 少有人走的路
  19. 在史蒂夫传中寻找现实扭曲力场1
  20. 在线画图工具-CCA与RDA分析_圈圈Bio_新浪博客

热门文章

  1. 记录金盾专用播放器加密视频提取工具逆向分析过程二
  2. 软件测试:什么是图灵测试
  3. linux系统清理磁盘空间
  4. MBP清除NVRAM和PRAM
  5. 生物群落多样性——β多样性
  6. Cocos Creator方向与角度转换
  7. vscode鼠标滚轮调整字体大小
  8. python二元一次方程组用鸡兔同笼的思路来写编程_3应用二元一次方程组——鸡兔同笼教学设计...
  9. C#语言自定义平方根函数
  10. SpringMVCfrom:form表单标签和input表单标签简介