python实现图片压缩

news2024/11/17 19:39:14

首先

pip install Pillow

compression_level参数,该参数的范围从0到100,其中0表示最小尺寸(最高压缩),100表示最大质量(最小压缩)。这个脚本将尝试在保持图片可识别性的同时,尽可能地减小图片的大小。

from PIL import Image
import os

def compress_images(source_folder, target_folder, max_size=(1024, 1024), compression_level=50):
    """
    压缩指定文件夹中的所有图片,并保存到目标文件夹,保持原有尺寸比例。
    
    :param source_folder: 源文件夹路径
    :param target_folder: 目标文件夹路径
    :param max_size: 图片的最大尺寸,元组形式 (宽度, 高度)
    :param compression_level: 压缩等级,0-100,等级越低,压缩后的图片越小
    """
    # 确保目标文件夹存在
    if not os.path.exists(target_folder):
        os.makedirs(target_folder)

    # 遍历源文件夹中的所有文件
    for filename in os.listdir(source_folder):
        # 检查文件扩展名是否为图片格式
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
            source_image_path = os.path.join(source_folder, filename)
            target_image_path = os.path.join(target_folder, filename)

            # 打开图片
            with Image.open(source_image_path) as img:
                # 保持图片的原始尺寸比例
                img.thumbnail(max_size, Image.Resampling.LANCZOS)

                # 根据压缩等级调整JPEG质量(PNG不受影响)
                if img.format == 'JPEG':
                    quality = max(1, int(100 - compression_level * 2))  # JPEG质量范围1-95
                    img.save(target_image_path, quality=quality, optimize=True)
                else:
                    # 对于PNG,我们尝试使用DEFLATE算法进行压缩
                    img.save(target_image_path, 'PNG', compress_level=compression_level, optimize=True)

                print(f"Compressed {filename} with level {compression_level} and saved to {target_image_path}")

# 指定源文件夹和目标文件夹
source_folder = 'path/to/source/folder'
target_folder = 'path/to/target/folder'

# 调用函数,这里我们设置压缩等级为0以获得最小尺寸
compress_images(source_folder, target_folder, compression_level=0)

compression_level为0时,质量设置为1(最小值),当compression_level为100时,质量设置为95(最大值)。对于PNG图片,我们使用了compress_level参数,它是PNG的压缩级别,范围从0(无压缩)到9(最大压缩)。

点击链接中的链接,欢迎一起来交流学习

互联网搞钱-CSDN博客文章浏览阅读1k次。从事互联网行业近10余年,现在成为了自由职业者,全职投入互联网,主要从事互联网副业、信息差、创业、赚钱思路等方面研究、实战和经验分享。https://blog.csdn.net/qq_30776829/article/details/136265463

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

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

相关文章

解锁TikTok直播专线,提高使用体验

TikTok,作为当今全球最受欢迎的社交媒体平台之一,给商家带来了无限的商机与市场。然而,商家在TikTok的网络体验也面临诸多挑战,例如网络卡顿、直播断线以及账号易被封锁等问题。为解决这些难题,我们推出了TikTok直播专…

系统安装(kuntaiR522 kvm安装)

(1)通过PC1 web连接Server2,给Server2安装rocky-arm64 CLI系统(语言为英文)。 首先是访问server2的IPMI口,访问192.168.2.10, 用户为Admin,密码为Admin@123 登录进去 以HTML5 集成控制台方式打开 插入U盘修改启动项安装系统

逆向案例9--小鹅通视频m3u8内容解密--含简单webpack

视频网址:https://app4nseessp8638.h5.xiaoeknow.com/v2/course/alive/l_65b9e8dfe4b064a83b90e102?type2&app_idapp4nseessp8638&channel_id&res_type4&pro_id&res_idl_65b9e8dfe4b064a83b90e102 按照惯例,刷新网站,搜…

MFC(二)集成基础控件

目录 OnCreateCStatic【标签,图片】CEdit【文本框,密码框,数值框,文本区】CButton【按钮,单选按钮,多选按钮】CComboBox【下拉列表,列表】CSliderCtrl【滑动条】CListCtrl【表格】CAnimateCtrl【…

LangChain核心概念与组件

Chains Chains可以让你按照一定的顺序和逻辑来执行不同的任务。Chains有以下四种类型: 类型作用LLMChain用于在语言模型周围添加一些功能的简单Chain,它由一个PromptTemplate和一个语言模型(LLM或chat model)组成,它…

FlorisBoard:Android开源键盘的现代化选择

FlorisBoard:Android开源键盘的现代化选择 简介 FlorisBoard是一款免费且开源的安卓键盘,适用于Android 7.0及以上版本的设备。它的现代化设计和用户友好的界面使其在众多键盘应用中脱颖而出。FlorisBoard的独特之处在于它注重用户体验的同时&#xff0…

ArcGIS二次开发(一)——搭建开发环境以及第一个简单的ArcGIS Engine 程序

Arcgis10.2、Arcgis Engine10.2与Microsoft Visual Studio 2012的版本进行安装 1、推荐教程与安装包2、安装顺序3、安装成功测试VS新建项目可以创建ArcGIS项目,并且在VS中拖拽ArcGIS工具 4、搭建第一个简单的ArcGIS Engine 程序 ArcEngine和VS版本是有对应的&#x…

如何高效系统地自学 Python?

导言: Python作为一门流行的编程语言,被广泛运用于数据分析、人工智能、网络应用等领域。想要系统地自学Python,并掌握其核心概念和编程技能,需要一定的方法和步骤。本文将介绍如何高效系统地自学Python,让你能够快速…

双纤SFP光模块和单纤SFP光模块之间的区别

双纤SFP光模块和单纤SFP光模块是两种不同的光模块类型。对于网络部署而言,了解它们之间的区别至关重要。本文将深入探讨这两种光模块之间的差异,并介绍其特性和适用场景。 双纤与单纤SFP光模块:它们是什么? 双纤SFP光模块是常用…

Netty源码剖析——ChannelHandler 篇(三十六)

ChannelHandler 作用及设计 public interface ChannelHandler {/*** Gets called after the {link ChannelHandler} was added to the actual context and its ready to handle events. 当把 ChannelHandler 添加到 pipeline 时被调用*/void handlerAdded(ChannelHandlerContex…

【前端面试3+1】01闭包、跨域、路由模式

一、对闭包的理解 定义: 闭包是指在一个函数内部定义的函数,并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点: 闭包可以访问外部函数的变量,即使外部函数已经执行完毕。…

游戏开发笔记:游戏海外版本时区问题(解释时区问题,分解为js写法和lua写法来分析记录,整理出对应语言的相关函数方法。)

对于海外游戏而言,与时间相关的功能,都不能忽略时区的计算。根据 ‘ 服务端资源是有限的,客户端资源是无穷无尽的 ’的定义来说,基本上时区包括时间的计算都是由客户端来进行计算,今天内容也是围绕客户端来展开。 时区算法常见的时间描述时区需要计算的点在lua语言中的写…

我与电源2 我要升压

上一篇文章中讲到,我从LM7805 开始 接触电子设计,后来,随着对更高耐压,更高电流及功率的需求,不断的接触更先进的,效率更高,功率密度更大的电源方案,从线性稳压器到 DCDC 的Buck 电路。从最初 DCDC的异步开关模式转到使用同步开关模式。 这里要对线性稳压器再说一点。…

library cache lock模拟和处理

会话一: create or replace procedure dummy is begin null; end; /begin Dummy; Dbms_lock.sleep(1000); End; /会话二: SQL> alter procedure dummy compile; 卡住 会话三: SQL> alter procedure dummy compile; 卡住 处理过程…

计算机基础系列 —— CPU

“Make everything as simple as possible, but no simpler.” – Albert Einstein 文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。 之前的文章里我们介绍了 Register、PC、RAM 和 ALU&#…

【蓝桥杯】tarjan算法

一.概述 Tarjan 算法是基于DFS的算法,用于求解图的连通性问题。 Tarjan 算法可以在线性时间内求出: 无向图: 割点与桥双连通分量 有向图: 强连通分量必经点与必经边 1.割点: 若从图中删除节点 x 以及所有与 x 关联的…

【学习】软件科技成果鉴定测试有何作用

软件科技成果鉴定测试是针对软件进行项目申报、科技成果鉴定等相关目的进行的测试。软件测试报告可作为项目申报、科技成果鉴定等工作的依据之一。软件类科技成果鉴定测试从软件文档、功能性、使用技术等方面对软件系统进行符合性测试。其测试结果证明软件的质量是否符合技术合…

机器学习笔记(2)—单变量线性回归

单变量线性回归 单变量线性回归(Linear Regression with One Variable)1.1 模型表示1.2 代价函数1.3 代价函数的直观理解1.4 梯度下降1.5 梯度下降的直观理解1.6 梯度下降的线性回归 单变量线性回归(Linear Regression with One Variable) ps:...今天很倒霉 一名小女孩悄悄地碎…

PTA金字塔游戏

幼儿园里真热闹,老师带着孩子们做一个名叫金字塔的游戏,游戏规则如下: 首先,老师把孩子们按身高从高到矮排列,选出最高的做队长,当金字塔的塔顶,之后在其余小朋友里选出两个最高的,…

JUC:打断正常线程、睡眠线程、park线程的interrupt状态、二阶段终止模式

文章目录 打断标记两阶段终止注意打断park线程 打断标记 睡眠中的线程被打断时,会抛出异常,把打断标记置为false,而不是变为true,wait和join也是。 打断 sleep,wait,join 的线程 这几个方法都会让线程进入…