• 【代码】Python3|用Python PIL压缩图片至指定大小,并且不自动旋转


    前言

    代码主体是GPT帮我写的,我觉得这个功能非常实用。

    参考

    解决自动旋转问题参考:一行代码解决PIL/OpenCV读取图片出现自动旋转的问题,增加一行代码image = ImageOps.exif_transpose(image) 即可恢复正常角度。

    用于压缩图片的函数

    from PIL import Image, ImageOps
    
    def compress_image(input_path, output_path, max_size=(400, 400)):
        """
        压缩图像为指定大小,并保存到指定路径。
        
        参数:
        input_path: 输入图像文件路径
        output_path: 输出图像文件路径
        max_size: 最大尺寸 (宽, 高),默认为 (400, 400)
        """
        try:
            # 打开图像文件
            image = Image.open(input_path)
    
            # 修正图片旋转问题
            image = ImageOps.exif_transpose(image) 
    
            # 缩放图像到指定大小
            image.thumbnail(max_size)
    
            # 检查输出文件夹是否存在
            output_dir = os.path.dirname(output_path)
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
            
            # 保存缩略图
            image.save(output_path)
            # print(f"已将图像压缩并保存到 {output_path}")
        except Exception as e:
            print(f"压缩图像时出错: {e}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    函数调用实例

    1 代码

    该代码会每五秒读取images.json内容,将其中的图片进行压缩,压缩后的图片保存在compressed_photos文件夹中。images.json文件格式如下:

    {
        "images": [
            "photos/1.jpg",       
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    完整代码如下:

    import os
    import json
    from time import sleep
    
    def compress_images_from_json(json_file, input_folder, output_folder):
        """
        从 JSON 文件中读取图像文件路径,然后压缩这些图像文件。
        
        参数:
        json_file: JSON 文件路径
        input_folder: 输入文件夹路径
        output_folder: 输出文件夹路径
        """
        try:
            with open(json_file, "r") as f:
                images_json = json.load(f)
                images = images_json.get("images", [])
                # 递归获取output_folder下的所有文件并以/拼接,删除不存在于images.json中的图片
                for root, dirs, files in os.walk(output_folder):
                    for file in files:
                        if os.path.join(root, file).replace(output_folder + "/", "") not in images:
                            os.remove(os.path.join(root, file))
                # 压缩图片
                for image in images:
                    input_path = os.path.join(input_folder, image)
                    output_path = os.path.join(output_folder, image)
                    compress_image(input_path, output_path)    
        except Exception as e:
            print(f"从 JSON 文件中读取图像文件路径并压缩时出错: {e}")
    
    if __name__ == "__main__":
        file_dir = os.path.dirname(os.path.abspath(__file__))
        input_folder = file_dir
        output_folder = os.path.join(file_dir, "compressed_photos")
        json_file = os.path.join(file_dir, "images.json")
        
        while True:
            compress_images_from_json(json_file, input_folder, output_folder)
            print("已压缩所有图像。")
            sleep(5) # 每5秒压缩一次图像
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    2 结果

    运行结果:

    在这里插入图片描述

    本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/138030475。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

  • 相关阅读:
    docker通过挂载conf文件启动redis
    hive调优原理详解:案例解析参数配置(第17天)
    如何用GPT进行课题申报,论文选题及实验方案设计?
    如何从华为恢复永久删除的视频?
    举例说明自然语言处理(NLP)技术
    推荐朋友计划成功的创意方法
    Cloudera Manager环境准备【一】
    vscode 连接ubuntu git下载缓慢
    工作中规范使用Java集合
    线性表但是是Java中数组实用使用
  • 原文地址:https://blog.csdn.net/qq_46106285/article/details/138030475