python批量压缩图像的完整步骤

作者:yuanzhoulvpi 时间:2022-05-14 16:10:47 

背景

今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过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文件夹中。

python批量压缩图像的完整步骤

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

python批量压缩图像的完整步骤

直接运行的脚本:


python ic.py xxx_文件夹

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

python批量压缩图像的完整步骤

完整代码:

如果上不去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()

写在后面

这个代码说起来难,说起来也不难,如果认真看我历史的文章的话,上面代码中遇到的知识点都就会了。像是所谓的图像压缩、并行处理之类的,其实并不难。

来源:https://blog.csdn.net/yuanzhoulvpi/article/details/122049330

标签:python,批量,压缩
0
投稿

猜你喜欢

  • 如何安装多版本python python2和python3共存以及pip共存

    2021-03-23 05:08:58
  • 想用户所想(感受亚马逊的设计)

    2007-08-26 17:09:00
  • python实现获取Ip归属地等信息

    2022-10-24 00:13:31
  • tensorflow基于CNN实战mnist手写识别(小白必看)

    2021-01-26 22:33:42
  • Python闭包和装饰器用法实例详解

    2021-04-07 10:05:02
  • python实现股票历史数据可视化分析案例

    2021-12-20 00:29:10
  • Python使用穷举法求两个数的最大公约数问题

    2022-01-20 21:26:51
  • Oracle数据库SQL语句性能调整的基本原则

    2009-03-25 16:55:00
  • W3C优质网页小贴士(四)

    2008-04-17 13:34:00
  • php中重定向网页跳转方法总结案例教程

    2023-06-11 20:47:18
  • php返回相对时间(如:20分钟前,3天前)的方法

    2023-10-26 11:20:38
  • Go微服务网关的实现

    2023-07-02 22:27:05
  • python3.6使用SMTP协议发送邮件

    2023-06-09 07:50:58
  • 在ASP.NET 2.0中操作数据之三十七:DataList批量更新

    2023-07-23 10:59:03
  • 在查询分析器理启动或停止SQL Agent服务

    2009-01-08 16:20:00
  • pytorch 优化器(optim)不同参数组,不同学习率设置的操作

    2021-09-14 05:05:44
  • 1 行 Python 代码快速实现 FTP 服务器

    2022-02-19 18:17:41
  • Python人脸识别第三方库face_recognition接口说明文档

    2022-07-12 04:15:37
  • 面向对象的XHTML与CSS编程

    2008-01-11 13:37:00
  • OpenCV实现人脸识别

    2023-01-07 02:38:58
  • asp之家 网络编程 m.aspxhome.com