使用python压缩图片

  1. 首先Linux上面要安装一些软件包
yum install -y libjpeg-devel

yum install -y zlib-devel

yum install -y libjpeg libtiff freetype 
  1. 其次需要安装python的依赖
pip3 install tinify

pip3 install Pillow
  1. 编写并运行以下代码

import os
from PIL import Image
import tinify
from concurrent.futures import ThreadPoolExecutor



# 配置部分
input_folder = '/img'  # 要压缩的图片文件夹
whitelist = {'example1.jpg', 'important_image.png'}  # 白名单中的文件
quality = 75  # 压缩质量

def compress_image(img_path, quality):
    """
    压缩单张图片并覆盖原文件。
    
    :param img_path: 图片路径
    :param quality: 压缩质量
    """
    try:
        img = Image.open(img_path)
        img.save(img_path, optimize=True, quality=quality)
        print(f"Compressed and saved in place: {img_path}")
    except Exception as e:
        print(f"Failed to compress {img_path}: {e}")

def compress_images_in_place(input_folder, whitelist=None, quality=75):
    """
    使用 Pillow 压缩图片并覆盖原文件,支持白名单功能。使用多线程加速处理。
    
    :param input_folder: 原始图片文件夹路径
    :param whitelist: 白名单列表,包含不希望被压缩的图片文件名(可选)
    :param quality: 压缩质量,默认75
    """
    if whitelist is None:
        whitelist = set()

    # 创建一个 ThreadPoolExecutor 来处理压缩任务
    with ThreadPoolExecutor() as executor:
        futures = []

        for root, dirs, files in os.walk(input_folder):
            for file in files:
                if file in whitelist:
                    print(f"Skipping (whitelisted): {file}")
                    continue

                if file.lower().endswith(('.jpg', '.jpeg', '.png')):
                    img_path = os.path.join(root, file)
                    futures.append(executor.submit(compress_image, img_path, quality))

        # 等待所有任务完成
        for future in futures:
            future.result()

# 调用压缩函数
compress_images_in_place(input_folder, whitelist, quality)

使用python压缩图片
https://blog.liuzijian.com/post/1728e608-681f-f381-82e5-b5a8b048620f.html
作者
Liu Zijian
发布于
2024年10月15日
许可协议