前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python实战】 ---- 批量图片压缩

【Python实战】 ---- 批量图片压缩

作者头像
Rattenking
发布2021-09-07 16:38:00
1.8K0
发布2021-09-07 16:38:00
举报
文章被收录于专栏:Rattenking

需求场景

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

需求分析

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

解决方案

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

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

导入包和创建公共变量

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

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

读取文件夹下所有文件

代码语言:javascript
复制
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. 最后计算本次压缩的时间。
代码语言:javascript
复制
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倍!

完整代码

代码语言:javascript
复制
"""
@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()

执行代码和结果

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

优化

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

优化后完整代码

代码语言:javascript
复制
"""
@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. 尽量使每个方法只做一件事!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求场景
  • 需求分析
  • 解决方案
  • 导入包和创建公共变量
  • 读取文件夹下所有文件
  • 对刷选文件做压缩处理
  • 压缩前图片
  • 压缩后图片
  • 完整代码
  • 执行代码和结果
  • 优化
  • 优化后完整代码
  • 总结
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档