Python ---- 批量图片压缩

需求场景

摄影网站发过来很多 1920*2880 的高清图片,基本每个图片都是 1MB 以上,由于网页浏览时图片过大,加载太慢,主要进行图片批量压缩处理,同时对图片进行有规律的命名!

需求分析

  1. 批量图片压缩;
  2. 有规律的命名!

解决方案

  1. 使用 cv2 进行压缩;【OpenCV 文档
  2. 使用 PIL 进行压缩;【PIL 中文文档

本文采用 PIL 进行图片压缩处理!

导入包和创建公共变量

  1. filePath 源文件所在文件夹路径
  2. fileNewPath 压缩后新文件保存的文件夹路径
  3. scale 缩放比例
  4. quality 初始压缩比率
from PIL import Image
import os
import time

filePath = '/mine0/mine1/'
fileNewPath = filePath + 'newimg/'
scale = 0.2
quality = 100

读取文件夹下所有文件

def readname():
  names = None
  try:
    names = os.listdir(filePath)
  except Exception as e:
    print(e)
    print('获取文件名列表失败!')
  else:
    print('获取文件名列表成功!')
    return names

对刷选文件做压缩处理

  1. 处理开始时间用于计算本次压缩所有的时间;
  2. 获取原始文件的文件名称列表;
  3. 循环读取列表获取文件名称;
  4. 筛选需要压缩的文件;
  5. 读取当前筛选文件;
  6. 获取当前图片的宽高;
  7. 按照比例计算压缩后宽高 scale;
  8. 修改图片尺寸;
  9. 按照 quality 比率进行压缩保存到对应路径;
  10. 注意图片名字是从1开始,刷选多少符合要求,保存一张依次递增;
  11. 最后计算本次压缩的时间。
def loopHandleFile():
  start = time.time()
  startTime = int(round(start * 1000))
  names = readname()
  index = 1
  try:
    for name in names:
      if('A---' in name):
        img = Image.open(filePath + name)
        w,h = img.size
        w,h = round(w * scale),round(h * scale)
        img = img.resize((w,h), Image.ANTIALIAS)
        img.save(fileNewPath + str(index) + '.jpg', optimize = True, quality = quality)
        index = index + 1
  except Exception as e:
    print(e)
    print('批量等比压缩图片失败!')
  else:
    print('批量等比压缩图片成功!')
    end = time.time()
    endTime = int(round(end * 1000))
    print('本次压缩用时:' + str(endTime - startTime) + ' ms')

压缩前图片

在这里插入图片描述

基本都是接近1MB左右;

压缩后图片

在这里插入图片描述

全部压缩,按照代码中0.2的100,大概有9倍!

完整代码

"""
@Author  :Rattenking
@Date    :2021/02/09 10:27
@CSDN	 :https://blog.csdn.net/m0_38082783
"""

from PIL import Image
import os
import time

filePath = '/mine0/mine1/'
fileNewPath = filePath + 'newimg/'
scale = 0.2
quality = 100
def readname():
  names = None
  try:
    names = os.listdir(filePath)
  except Exception as e:
    print(e)
    print('获取文件名列表失败!')
  else:
    print('获取文件名列表成功!')
    return names

def loopHandleFile():
  start = time.time()
  startTime = int(round(start * 1000))
  names = readname()
  index = 1
  try:
    for name in names:
      if('A---' in name):
        img = Image.open(filePath + name)
        w,h = img.size
        w,h = round(w * scale),round(h * scale)
        img = img.resize((w,h), Image.ANTIALIAS)
        img.save(fileNewPath + str(index) + '.jpg', optimize = True, quality = quality)
        index = index + 1
  except Exception as e:
    print(e)
    print('批量等比压缩图片失败!')
  else:
    print('批量等比压缩图片成功!')
    end = time.time()
    endTime = int(round(end * 1000))
    print('本次压缩用时:' + str(endTime - startTime) + ' ms')
if __name__ == "__main__":
  loopHandleFile()

执行代码和结果

PS H:\mine0\mine1> python compressImg.py
获取文件名列表成功!
批量等比压缩图片成功!
本次压缩用时:7662 ms

优化

  1. 动态获取当前脚本的执行路径;
  2. 健壮代码,判断图片压缩后的保存路径是否存在;
  3. 如果有需求需要,可以在保存时,添加删除源文件代码(此处谨慎操作,可能你压缩后的文件不满,需重新压缩。所以我没有删除源文件)。

优化后完整代码

"""
@Author  :Rattenking
@Date    :2021/02/09 10:27
@CSDN	 :https://blog.csdn.net/m0_38082783
"""

from PIL import Image
import os
import time

filePath = os.path.dirname(os.path.abspath(__file__)) + '/'
fileNewPath = filePath + 'newimg/'
scale = 0.2
quality = 100

# 获取当前文件夹下的文件名列表
def readname():
  names = None
  try:
    names = os.listdir(filePath)
  except Exception as e:
    print(e)
    print('获取文件名列表失败!')
  else:
    print('获取文件名列表成功!')
    return names

# 修改文件尺寸和压缩文件
def withDataImage(names):
  index = 1
  for name in names:
    if('A---' in name):
      img = Image.open(filePath + name)
      w,h = img.size
      w,h = round(w * scale),round(h * scale)
      img = img.resize((w,h), Image.ANTIALIAS)
      img.save(fileNewPath + str(index) + '.jpg', optimize = True, quality = quality)
      index = index + 1

# 压缩时间的计算
def loopHandleFile():
  start = time.time()
  startTime = int(round(start * 1000))
  names = readname()
  try:
    if not os.path.exists(fileNewPath):
      os.makedirs(fileNewPath)
    withDataImage(names)
  except Exception as e:
    print(e)
    print('批量等比压缩图片失败!')
  else:
    print('批量等比压缩图片成功!')
    end = time.time()
    endTime = int(round(end * 1000))
    print('本次压缩用时:' + str(endTime - startTime) + ' ms')

if __name__ == "__main__":
  loopHandleFile()

总结

  1. 脚本总是在需求的增多不断完善;
  2. 尽量使自己的代码更加健壮;
  3. 尽量使每个方法只做一件事!

猜你喜欢

转载自blog.csdn.net/m0_38082783/article/details/113767766
今日推荐