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

news2025/1/14 17:59:19

代码主体是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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 表格获取当前行索引,加颜色

vue 表格获取当前行索引&#xff0c;加颜色 <span styledisplay:inline-block;width:10px;height:10px;border-radius:50% :style"{background:color[scope.$index]}" />//定义颜色color: [#5387F7, #A794E0, #F3543C, #999999, #77D3F8, #FFA1B4, #26CEBA, #…

【Cookie和Session的区别(面试重点)】

Cookie和Session的区别 1. Cookie1.1 认识Cookie1.2 Cookie的引出1.3 Cookie工作原理1.4 Cookie重要结论 2. Session2.1 认识Session2.2 Session的引出2.3 Session的工作原理 3. Cookie和Session的区别 1. Cookie 1.1 认识Cookie Cookie&#xff1a;是小型文本文件&#xff0…

python自动生成SQL语句自动化

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python自动生成SQL语句自动化 在数据处理和管理中&#xff0c;SQL&#xff08;Structured …

鸿蒙OpenHarmony【LED外设控制】 (基于Hi3861开发板)

概述 OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力&#xff0c;包含I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM、FLASH等。本文介绍如何通过调用OpenHarmony的NDK接口&#xff0c;实现对GPIO控制&#xff0c;达到LED闪烁的效果。其他的IOT外设控制&#xff0…

【python】python新闻文本数据统计和聚类 (源码+文本)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【UE5.1 C++】VS2022下载安装

目录 步骤 一、Visual Studio下载安装 二、Visual Studio Integration Tool插件安装 先看一下UE和VS的兼容性 &#xff08;虚幻5&#xff1a;为虚幻引擎C项目设置Visual Studio开发环境&#xff09; &#xff08;虚幻4&#xff1a;设置虚幻引擎的Visual Studio&#xff0…

生产数据采集系统

在数字化浪潮的推动下&#xff0c;生产数据采集系统已经成为企业提升生产效率、优化运营管理的关键工具。那么&#xff0c;什么是生产数据采集系统呢&#xff1f;简单来说&#xff0c;生产数据采集系统是指通过一系列技术手段&#xff0c;实时收集、处理和分析生产线上的各类数…

[负债学习]支线Python4.21

三的东西&#xff0c;一个是环境&#xff0c;一个是基础语法&#xff0c;第3个是代码的案例。 我们先从头开始讲一下计算机&#xff0c;它主要由4个部分组成cpu的中央处理器和一个储存和一个输出和出。而储存的话主要是由内存和外存而cpu&#xff0c;中央处理器全称叫做通用计…

vuex和pinia转态管理工具介绍

文章目录 一、介绍二、使用1、pinia使用2、Vuex使用 一、介绍 相同点&#xff1a; 都是Vue.js的状态管理工具 不同点&#xff1a; 区别PiniaVuex支持Vue2和Vue3都支持Vue3写法需要额外配置Mutation只有 state, getter 和 action&#xff0c;无Mutationaction异步、Mutation …

【学习】服务器解决:重新分配同样端口号后,连不上VScode

原来服务器分配的环境有问题&#xff0c;重新分配了一下。还是同样的端口号&#xff0c;Xshell和xftp能够连接上&#xff0c;但是VScode连接不上。 问题解决: 清除本地 SSH 缓存中与远程主机相关的条目可以通过编辑 known_hosts 文件来实现。这个文件包含了您曾经连接过的远程主…

1分钟带你学会Series显式索引和隐式索引

1.Series的索引 Series是Pandas库中的一种一维数据结构对象&#xff0c;与常规的一维数组相比&#xff0c;其最显著的特点在于拥有显式的索引结构。这种显式索引使得Series在数据处理和分析中更具灵活性和便利性。 显式索引指的是Series中每个元素除了值之外&#xff0c;还关…

sketchup{su}安装错误1402

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展&#xff0c;输入1402&#xff0c;点击搜索 等待修复成功既可尝试重新安装su 软件每周六选择其他方式登录免费使用

Python 高质量类编写指南

原文&#xff1a;https://www.youtube.com/watch?vlX9UQp2NwTk 代码&#xff1a;https://github.com/ArjanCodes/examples/tree/main/2023/classguide Python 高质量类编写指南 我们将通过一些方法增加类的可读性和易用性。 通过&#xff08;按照属性或行为&#xff09;拆分类…

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义&#xff1a;二进制流是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频…

Linux thermal框架介绍

RK3568温控 cat /sys/class/thermal/thermal_zone0/temp cat /sys/class/thermal/thermal_zone1/temp cat /sys/class/thermal/cooling_device0/cur_state cat /sys/class/thermal/cooling_device1/cur_state cat /sys/class/thermal/cooling_device2/cur_state thermal_zone…

文件File类的学习

File类 File类创建File实例创建文件删除文件创建目录 Reader小结 File类 在java中,通过java.io.File类来对一个文件进行抽象的描述. 下面我们来看看File类的构造方法:签名说明File(File parent, String child)根据父目录孩子文件路径,创建出一个新的File实例File(String pathn…

web--crlf注入,url重定向,web资源处理

crlf漏洞 正常的数据包 更改过 就变成这样了 配合xss 然后那个xss脚本就会被启用 crlffuzz url重定向 后面有url地址 改成baidu.com然后再访问&#xff0c;他就会自动访问baidu 实例 web资源处理 对于一张图片 当我们这样 加载的时候&#xff0c;会 无限解压缩包 这是一个…

vue快速入门(三十四)组件data定义方法

注释很详细&#xff0c;直接上代码 上一篇 新增内容 数据绑定方法照常数据定义方法需要作为函数返回值 源码 MyTest.vue <template><div><h1>我的功德&#xff1a;{{merits}} </h1><button click"meritsnum1">功德加一</button>…

什么是用户体验(UX)文案,为什么它很重要?

网上购物如今比以往任何时候都更加相关。所以我们将以此为例说明什么是用户体验&#xff08;UX&#xff09;文案&#xff0c;以及为什么它很重要。 假设你去了一个在线商店。你需要执行一系列操作&#xff1a; 找到合适的部分选择你感兴趣的产品弄清楚它们是什么&#xff0c;…

(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标&#xff1a; 掌握 Java Stream流的相关api 掌握 Java Stream流的基本实现 掌握 java Stream流的使用场景 代码已经整理上传到了gitee中&#xff0c;有需要的小伙伴可以取查看一下源码点个小心心喔 大家也可以帮我提交一点案例喔&#xff01;&#xff01;&#xff01;&…