python知识点100篇系列(10)-使用python压缩图片的两种方式

2024-09-24 09:35:40 浏览数 (1)

使用python压缩图片大小分为两种情况:

  • 缩小图片尺寸,同时缩小了图片大小
  • 不改变图片尺寸,降低图片质量,缩小图片质量

两种情况都要使用PIL模块;

第一种情况,使用resize方法:

伪代码如下:

代码语言:python代码运行次数:0复制
# 压缩图片文件
def compress_image(outfile, mb=150, k=0.9):
 
   """
   :param outfile: 压缩文件保存地址
   :param mb: 压缩目标,KB
   :param k: 每次调整的压缩比率
   :return: 压缩文件地址,压缩文件大小
   """
   from PIL import Image
   from PIL import ImageFile
   
   o_size = os.path.getsize(outfile) // 1024
   print(o_size, mb)
   if o_size <= mb:
       return outfile
   
   ImageFile.LOAD_TRUNCATED_IMAGES = True
   while o_size > mb:
       im = Image.open(outfile)
       x, y = im.size
       out = im.resize((int(x*k), int(y*k)), Image.ANTIALIAS)
       try:
           out.save(outfile)
       except Exception as e:
           print(e)
           break
       o_size = os.path.getsize(outfile) // 1024
   return outfile

第一种情况,使用save方法并添加quality参数:

伪代码如下:

代码语言:python代码运行次数:0复制
# 不改变图片尺寸压缩到指定大小
def compress_img(img_path,new_img_path):
    import os
    from PIL import Image

    #img_path = "path/to/your/image"  # 要压缩的图片路径
    #new_img_path = "path/to/your/new/image"  # 压缩好的图片保存路径

    target_size = 150 * 1024  # 单位:字节(B),即目标大小 150 KB
    quality = 80  # 保留质量,1-100(默认 75),1 最差,100 最好,不建议过高且 100 会禁用一些压缩算法
    step = 10  # 降低质量的步长

    current_img = Image.open(img_path)  # 初始化当前图片为原图
    current_size = os.path.getsize(img_path)  # 初始化当前大小为原图片大小

    while current_size > target_size and quality > 0:
        current_img.save(new_img_path, quality=quality,
                        optimize=True)  # 压缩新图片到 new_img_path
        current_img = Image.open(new_img_path)  # 更新 current_img 为压缩后的新图片
        # 更新 current_size 为压缩后的新图片大小
        current_size = os.path.getsize(new_img_path)
        quality -= step

0 人点赞