python批量压缩裁剪图片

裁剪图片(直接覆盖原图)

from PIL import Image
import os


def resize_image_by_ratio(image_path, target_width=None, target_height=None, ratio=None):
    """
    按照指定的比例或尺寸裁剪图片。

    :param image_path: 输入图片的路径
    :param output_path: 输出图片的路径
    :param target_width: 目标宽度,如果为None,则根据ratio计算
    :param target_height: 目标高度,如果为None,则根据ratio计算
    :param ratio: 缩放比例,如果target_width和target_height都为None,则必须提供ratio
    """
    # 打开图片
    with Image.open(image_path) as img:
        width, height = img.size

        # 根据提供的参数计算目标尺寸
        if target_width is None and target_height is None and ratio is not None:
            target_width = int(width * ratio)
            target_height = int(height * ratio)
        elif target_width is not None and target_height is None:
            target_height = int((target_width / width) * height)
        elif target_width is None and target_height is not None:
            target_width = int((target_height / height) * width)

        # 调整图片大小
        resized_img = img.resize((target_width, target_height))

        # 保存调整后的图片
        resized_img.save(image_path)

压缩图片

def resize_and_compress_to_size(image_path, target_size_bytes):
    """
    尝试调整图片大小并压缩至接近指定的字节数。

    :param image_path: 输入图片的路径
    :param target_size_bytes: 目标文件大小,以字节为单位
    """
    # 打开图片
    with Image.open(image_path) as img:
        original_format = img.format
        quality = 95  # 开始时使用较高的质量
        step = 5  # 每次迭代减少的质量值
        img.thumbnail(img.size)  # 确保图片不会被放大

        while True:
            # 保存图片到临时文件,以便检查大小
            print("quality================", quality)
            temp_file = f"{image_path}.temp"
            img.save(temp_file, format=original_format, quality=quality)

            # 检查文件大小
            file_size = os.path.getsize(temp_file)

            # 如果文件大小大于目标大小,降低质量
            if file_size > target_size_bytes:
                quality -= step
                if quality <= 0:
                    break  # 防止无限循环
            # 如果文件大小小于或等于目标大小,停止循环
            elif file_size <= target_size_bytes:
                break

        # 删除临时文件
        os.remove(temp_file)

        # 使用找到的最佳质量值保存图片
        img.save(image_path, format=original_format, quality=quality)
def resize_and_compress_images_in_dir(directory, target_size_bytes=None, target_width=None, target_height=None,
                                      ratio=None):
    """
    处理指定目录下的所有图片,可以按比例缩放或压缩至指定大小。

    :param directory: 包含图片的目录路径
    :param target_size_bytes: 目标文件大小,以字节为单位,用于压缩
    :param target_width: 目标宽度,用于缩放
    :param target_height: 目标高度,用于缩放
    :param ratio: 缩放比例,用于缩放
    """
    for filename in os.listdir(directory):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            image_path = os.path.join(directory, filename)
            if target_size_bytes is not None and target_width is not None:
                resize_and_compress_to_size(image_path, target_size_bytes)
                resize_image_by_ratio(image_path, target_width=target_width, target_height=target_height, ratio=ratio)


image_path = "D:\jingdong\定金_【诚邀试驾】_阿维塔_11_鸿蒙版_情感智能电动SUV_试驾享50元E卡【图片_价格_品牌_报价】_京东"
target_width = 280
target_heigh = 280
# 使用示例
target_size_bytes = 29000  # 目标文件大小,例如29KB
# 或者使用缩放参数
# target_width = 300
# ratio = 0.5

resize_and_compress_images_in_dir(image_path, target_size_bytes=target_size_bytes, target_width=target_width,
                                  target_height=target_heigh)
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值