【代码】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}")

应用实例如下:

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秒压缩一次图像

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

{
    "images": [
        "photos/1.jpg",       
    ]
}

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

史上最全的四分之一、半车再到全车7自由度常规悬架建模与仿真之一

一、悬架建模的简化过程 汽车是一个复杂的振动系统,针对不同的需求进行不同的简化。在对悬架振动分析中,把汽车车身看做一个刚体,把驾驶员座椅和驾驶员拿掉;车身以下至车轮之间的橡胶垫,连接杆,弹簧等具有…

【已解决】电脑设置notepad++默认打开txt

1、以管理员的方式打开notepad 步骤:打开设置 -> 首选项 -> 文件关联 2、 设置Notepad默认打开 按照以下步骤将Notepad设置为默认打开.txt文件: 右键单击任何一个.txt文件。选择“属性”。在“常规”选项卡中,找到“打开方式”&#…

5.Eureka原理分析

消费者如何获取服务提供者具体信息? 1.服务提供者启动时向Eureka注册自己的信息。 2.Eureka保存这些信息。 3.消费者根据服务名称向Eureka拉取提供者信息。 如果有多个服务的提供者,消费者该如何选择? 1.服务消费者利用负载均衡算法&…

css-Echarts图表初始显示异常非完全显示

1.echarts图表初始加载异常 2.问题原因 初次加载时,由于外层使用%比 echarts dom元素没有完全加载完成,canvas绘画继承本身宽高,造成Echarts图表初始显示异常非完全显示。 3.使用echarts图表可参考以下代码(实现一定的自适应&am…

ccfcsp201312-2 ISBN号码

注意&#xff1a;50分 -- u10&#xff0c;最后一位为X 代码&#xff1a; #include <bits/stdc.h> using namespace std; string s; int a[12]; int main() {cin >> s;a[1] s[0] - 0;a[2] s[2] - 0;a[3] s[3] - 0;a[4] s[4] - 0;a[5] s[6] - 0;a[6] s[7] - …

英特尔直面AMD强势出击,新Xeon CPU 3D堆叠 288核

英特尔的新Xeon CPU直面AMD&#xff1a;3D堆叠 288核&#xff01; 英特尔加速其“四年五个节点”战略&#xff0c;计划在 2025 年推出搭载 3D 堆叠技术的 Clearwater Forest Xeon 数据中心 CPU。采用新的封装技术&#xff0c;该芯片将采用 tile-based CPU 设计&#xff0c;旨在…

Jackson 2.x 系列【29】Spring Boot 集成之 Redis 序列化/反序列化

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. RedisTemplate3. RedisSerializer3.1 J…

Window中Jenkins部署asp/net core web主要配置

代码如下 D: cd D:\tempjenkins\src\ --git工作目录 dotnet restore -s "https://nuget.cdn.azure.cn/v3/index.json" --nuget dotnet build dotnet publish -c release -o %publishPath% --发布路径

LeetCode - 面试题 08.06. 汉诺塔问题

目录 题目链接 解题思路 解题代码 题目链接 LeetCode - 面试题 08.06. 汉诺塔问题 解题思路 假设 n 1,只有一个盘子&#xff0c;很简单&#xff0c;直接把它从 A 中拿出来&#xff0c;移到 C 上&#xff1b; 如果 n 2 呢&#xff1f;这时候我们就要借助 B 了&#xff0c;因…

【BUG】Hexo|GET _MG_0001.JPG 404 (Not Found),hexo博客搭建过程图片路径正确却找不到图片

我的问题 我查了好多资料&#xff0c;结果原因是图片名称开头是_则该文件会被忽略。。。我注意到网上并没有提到这个问题&#xff0c;遂补了一下这篇博客并且汇总了我找到的所有解决办法。 具体检查方式&#xff1a; hexo生成一下静态资源&#xff1a; hexo g会发现这张图片…

Linux安装Docker完整教程及配置阿里云镜像源

官网文档地址 安装方法 1、查看服务器内核版本 Docker要求CentOS系统的内核版本高于3.10 uname -r #通过 uname -r 命令查看你当前的内核版本2、首先卸载已安装的Docker&#xff08;如果有&#xff09; 2.1 确保yum包更新到最新 yum update2.2 清除原有的docker&#xff0c…

【Linux开发 第七篇】权限

权限 Linux组权限修改权限 Linux组 在linux中的每个用户必须属于一个组&#xff0c;不能独立于组外 文件/目录 所有者 一般为文件的创建者&#xff0c;谁创建了该文件&#xff0c;就自然的成为了该文件的所有者 这一列即为文件的所有者 修改文件的所有者&#xff1a; chown…

从C到JAVA之学习JAVA的第一周笔记

文章目录 java语言概述JDK与JRE编写执行过程第一份java代码解读编写编译运行其他 注释三种注释方法 java API文档关键字标识符数据类型基本数据类型自动类型提升规则引用数据类型 string概述String与基本数据类型的变量间的运算 运算符键盘录入运行控制语句数组定义与静态初始化…

深度学习500问——Chapter08:目标检测(2)

文章目录 8.2.4 R-FCN 8.2.5 FPN 8.2.6 Mask R-CNN 8.2.4 R-FCN R-FCN 有哪些创新点 R-FCN仍然属于two-stage目标检测算法&#xff1a;RPN R-FCN Fully convolutional位置敏感得分图&#xff08;position-sentive score maps&#xff09; our region-based detector is ful…

【嵌入式】嵌入式开发中常见的面试题(持续更新中)

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Spring Boot中接收各种各样的参数

一、接收json参数&#xff0c;封装为Map 1.1、核心代码 /*** 接收json参数&#xff0c;封装为Map* param servletRequest* return* throws Exception*/ PostMapping("/getParam") public R getParam(HttpServletRequest servletRequest) throws Exception {Map<…

Linux 认识与学习Bash——2

1 read 从键盘读取变量的值 read 后面不带变量&#xff0c;那么默认会给REPLY变量赋值 #!/bin/bash echo -n "请输入你的名字&#xff1a;" read name echo "欢迎您 $name" echo "----------------"echo -n "请输入你的名字2&#xff1a;&q…

VR全景:为户外游玩体验插上科技翅膀

随着VR全景技术的愈发成熟&#xff0c;无数人感到惊艳&#xff0c;也让各行各业看到了一片光明的发展前景。尤其是越来越多的文旅景区开始引入VR全景技术&#xff0c;相较于以往的静态风景图&#xff0c;显然现在的VR全景结合了动态图像和声音更加吸引人。 VR全景技术正在逐步改…

肿瘤相关成纤维细胞分型及单细胞深入研究(文献)

目录 ①六种癌症类型共有的CAF亚型&#xff08;pan-CAFs&#xff09; 1&#xff0c;六种泛CAF亚型的鉴定和分子表征 2&#xff0c;Pan-CAF亚型特异性转录因子和基因调控网络 3&#xff0c;预后分析 4&#xff0c;Pan-CAF亚型与肿瘤中特定分子功能的关联 ②泛癌单细胞转录…

【论文精读】Bag of Tricks for Image Classification with Convolutional Neural Networks

这篇文章比较早了&#xff0c;2018年的 摘要 最近在图像分类研究方面取得的大部分进展可以归功于训练程序的改进&#xff0c;如数据增强和优化方法的改变。然而&#xff0c;在文献中&#xff0c;大多数改进要么作为实现细节简要提到&#xff0c;要么只在源代码中可见。在本文中…