当前位置: 首页 > news >正文

Python照片压缩教程详解


介绍

在日常的编程工作中,我们经常需要处理图像,例如上传、下载、显示、编辑等。有时候,我们需要对图像进行压缩,以减少占用的空间和带宽,提高加载速度和用户体验。那么,如何用Python来实现图像压缩呢?

在本教程中,我们将介绍一个强大的Python图像处理库——PIL(Python Imaging Library),它可以让我们对图像做很多事情,例如压缩图像。我们将通过一些例子或数据讲解PIL库具体的使用方法和api用途。本教程面向的是新手程序员,所以我们会尽量简单明了地解释每一步。

安装PIL库

要使用PIL库,我们首先需要安装它。有两种方法可以安装PIL库:

  • 方法一:使用pip命令,在终端或命令行中输入以下代码:

pip install Pillow
  • 方法二:从官网下载Pillow源码包,解压后,在终端或命令行中进入源码目录,输入以下代码:

python setup.py install

注意:Pillow是PIL库的一个分支,它是更加活跃和完善的版本,所以我们推荐使用Pillow而不是PIL。

Pillow对python的版本有一定要求,详见下图:

安装完成后,我们可以在Python中导入PIL库,检查是否成功:

from PIL import Image
print(Image.__version__)

如果输出了Pillow的版本号,例如8.4.0,那么说明安装成功了。

打开和保存图像

要对图像进行压缩,我们首先需要打开图像文件,并保存为一个Image对象。Image对象是PIL库中最基本的类,它表示一个图像,并提供了很多属性和方法来操作图像。

打开图像文件的方法很简单,只需要调用Image类的open方法,传入文件名或文件路径即可:

img = Image.open("test.jpg")

如果文件不存在或格式不支持,会抛出异常。所以我们可以用try-except语句来捕获异常,并打印错误信息:

try:img = Image.open("test.jpg")
except IOError as e:print(e)

保存图像文件也很简单,只需要调用Image对象的save方法,传入文件名或文件路径即可:

img.save("new.jpg")

                                       

如果要指定保存的格式,可以传入format参数,例如:

img.save("new.png", format="PNG")

                                     

如果要指定保存的质量,可以传入quality参数,取值范围是1-95,默认是75。质量越高,文件越大,压缩效果越差;质量越低,文件越小,压缩效果越好。例如:

img.save("new.jpg", quality=50)

获取和修改图像信息

在对图像进行压缩之前,我们可能需要获取一些图像的基本信息,例如大小、格式、模式等。这些信息可以通过Image对象的属性来获取:

  • size属性:返回一个元组,表示图像的宽度和高度(单位是像素),例如(800, 600)。

  • format属性:返回一个字符串,表示图像的格式,例如"JPEG"。

  • mode属性:返回一个字符串,表示图像的模式,例如"RGB"。

例如:

print(img.size) # (800, 600)
print(img.format) # JPEG
print(img.mode) # RGB

如果要修改图像的大小、格式或模式,可以使用Image对象的方法:

  • resize方法:接受一个元组作为参数,表示新的宽度和高度(单位是像素),返回一个新的Image对象,例如:

new_img = img.resize((400, 300))
  • convert方法:接受一个字符串作为参数,表示新的模式,返回一个新的Image对象,例如:

#转化为为灰色图像
new_img = img.convert("L")

                                          

  • transpose方法:接受一个常量作为参数,表示旋转或翻转的方式,返回一个新的Image对象,例如:

#旋转90度
new_img = img.transpose(Image.ROTATE_90)

                                      

压缩图像

有了上面的知识,我们就可以开始压缩图像了。压缩图像的本质就是减少图像的大小和质量,从而减少图像占用的空间和带宽。我们可以通过以下几种方式来压缩图像:

  • 改变图像的大小:通过resize方法,我们可以将图像的宽度和高度缩小一半或更多,这样就可以大幅度减少图像的像素数,从而减少图像的大小。例如:

img = Image.open("test.jpg")
print(img.size) # (640, 640)
new_img = img.resize((400, 300))
print(new_img.size) # (400, 300)
new_img.save("new.jpg")

         

  • 改变图像的格式:通过save方法,我们可以将图像保存为不同的格式,不同的格式有不同的压缩算法和效率,一般来说,JPEG格式比PNG格式更适合压缩彩色图像,而PNG格式比JPEG格式更适合压缩黑白或透明图像。例如:

img = Image.open("test.png")
print(img.format) # PNG
img.save("new.jpg", format="JPEG")
print(new_img.format) # JPEG
  • 改变图像的质量:通过save方法,我们可以指定quality参数,来控制图像保存时的质量。质量越低,压缩效果越好,但是也会损失一些细节和清晰度。我们可以根据需要,选择一个合适的质量值。例如:

img = Image.open("test.jpg")
img.save("new.jpg", quality=50)
  • 改变图像的模式:通过convert方法,我们可以将图像转换为不同的模式。不同的模式有不同的颜色数和位深度,一般来说,颜色数越少,位深度越低,压缩效果越好。例如,RGB模式有16777216种颜色,每个像素占用24位;L模式只有256种颜色,每个像素占用8位;1模式只有2种颜色(黑白),每个像素占用1位。所以,我们可以将彩色图像转换为灰度或黑白图像来压缩。例如:

img = Image.open("test.jpg")
print(img.mode) # RGB
new_img = img.convert("L")
print(new_img.mode) # L
new_img.save("new.jpg")

总结

本教程介绍了如何使用PIL库来压缩图像。我们学习了如何安装、打开、保存、获取、修改和压缩图像。我们还了解了一些基本的概念和方法,例如大小、格式、模式、resize、convert等。通过这些知识和技能,我们可以轻松地对图像进行压缩,并提高编程效率和用户体验。

本教程只是PIL库功能的一小部分,PIL库还有很多其他的功能和方法,例如裁剪、旋转、滤镜、文字、水印等。如果你想了解更多,请参考PIL官方文档。

希望本教程对你有所帮助!

相关文章:

Python照片压缩教程详解

介绍 在日常的编程工作中,我们经常需要处理图像,例如上传、下载、显示、编辑等。有时候,我们需要对图像进行压缩,以减少占用的空间和带宽,提高加载速度和用户体验。那么,如何用Python来实现图像压缩呢&…...

软路由的负载均衡设置:优化网络性能和带宽利用率

在现代网络环境中,提升网络性能和最大化带宽利用率至关重要。通过合理配置软路由IP的负载均衡设置,可以有效地实现这一目标,并提高整体稳定性与效果。本文将详细介绍如何进行软路由IP的负载均衡设置,从而优化网络表现、增加带宽利…...

CH06_第一组重构(上)

提取函数(Extract Function |106) 曾用名:提炼函数(Extract Function) 反向重构:内联函数(115) 示例代码 function printOwing(invoice) {printBanner();let outstanding calcul…...

RHCSA-VMware Workstation Pro-Linux基础配置命令

1.代码命令 1.查看本机IP地址&#xff1a; ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1&#xff1a;<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>为虚拟机自身网卡 2.测试网络联通性&#xff1a; [f…...

YOLO-NAS详细教程-姿势估计实现

姿势估计是一项计算机视觉任务,涉及估计图像或视频中物体或人的位置和方向。它通常涉及识别特定的关键点或身体部位(例如关节),并确定它们的相对位置和方向。姿势估计有许多应用,包括机器人、增强现实、人机交互和运动分析。 自上而下和自下而上是姿态估计中两种常用的方法…...

【扩散模型 李宏毅B站教学以及基础代码运用】

李宏毅教学视频&#xff1a; Link1 B站DDPM公式推导以及代码实现&#xff1a; Link2 这个视频里面有论文里面的公式推导&#xff0c;并且1小时10分开始讲解实例代码。 文章目录 扩散模型概念&#xff1a;Diffusion Model工作原理&#xff1a;影像生成模型本质上的共同目标B站…...

SpringBoot隐藏文件

1.设置 2.输入file Types 3.点击忽略文件或者文件夹 4.成功...

常见数据库介绍对比之SQL关系型数据库

1.关系型数据库介绍 关系型数据库是一种基于关系模型的数据库&#xff0c;它使用表格来组织和存储数据。下面是一些常见的关系型数据库&#xff1a; 1.1. MySQL MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于Web应用程序和企业级…...

OLED透明屏模块:引领未来显示技术的突破

OLED透明屏模块作为一项引领未来显示技术的突破&#xff0c;以其独特的特点和卓越的画质在市场上引起了广泛关注。 根据行业报告&#xff0c;预计到2025年&#xff0c;OLED透明屏模块将占据智能手机市场的20%份额&#xff0c;并在汽车导航系统市场中占据30%以上份额。 那么&am…...

Python_操作记录

1、Pandas读取数据文件&#xff08;以文本文件作为示例&#xff09;&#xff0c;sep表示间隔&#xff0c;headerNone表示无标题行 df pd.read_table("data/youcans3.dat", sep"\t", headerNone) 2、线性规划问题求解 1&#xff09;问题定义&#xff0c;…...

常用激活函数整理

最近一边应付工作&#xff0c;一边在补足人工智能的一些基础知识&#xff0c;这个方向虽然新兴&#xff0c;但已是卷帙浩繁&#xff0c;有时不知从何入手&#xff0c;幸亏有个适合基础薄弱的人士学习的网站&#xff0c;每天学习一点&#xff0c;积跬步以至千里吧。有像我一样学…...

uniapp 地图跳转到第三方导航软件 直接打包成apk

// 判断是否存在导航软件judgeHasExistNavignation() {let navAppParam [{pname: com.baidu.BaiduMap,action: baidumap://}, // 百度{pname: com.autonavi.minimap,action: iosamap://}, // 高德{pname: com.tencent.map,action: tencentmap://}, // 腾讯];return navAppPara…...

CentOS 8 通过YUM方式升级最新内核

CentOS 8 通过YUM方式升级最新内核 查看当前内核 uname -r 4.18.0-193.6.3.el8_2.x86_64导入 ELRepo 仓库的公钥&#xff1a; rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org安装升级内核相关的yum源仓库(安装 ELRepo 仓库的 yum 源) yum install https://www…...

java 版本企业招标投标管理系统源码+功能描述+tbms+及时准确+全程电子化

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…...

Python爬虫数据存哪里|数据存储到文件的几种方式

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 爬虫请求解析后的数据&#xff0c;需要保存下来&#xff0c;才能进行下一步的处理&#xff0c;一般保存数据的方式有如下几种&#xff1a; 文件&#xff1a;txt、csv、excel、json等&#xff0c;保存数据量小。 关系型数据库…...

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…...

git撤销修改命令

要撤销Git中尚未提交的所有修改,可以使用以下几种方法: 1、使用git checkout命令丢弃工作目录的修改&#xff0c;重置工作目录中所有文件的修改。 git checkout . 2、使用git reset命令重置暂存区和工作目录&#xff0c; 重置暂存区和工作目录,回到最后一次提交后的状态。 …...

EOCR-AR电机保护器自动复位的启用条件说明

为适用不同的现场使用需求&#xff0c;施耐德韩国公司推出了带有自动复位功能的模拟型电动机保护器-EOCR-AR。EOCR-AR电机保护器具有过电流、缺相、堵转保护功能&#xff0c;还可根据实际需要设置自动复位时间。 EOCR-AR自动复位的设置方法 如上图&#xff0c;R-TIME旋钮是自动…...

Apache nginx解析漏洞复现

文章目录 空字节漏洞安装环境漏洞复现 背锅解析漏洞安装环境漏洞复现 空字节漏洞 安装环境 将nginx解压后放到c盘根目录下&#xff1a; 运行startup.bat启动环境&#xff1a; 在HTML文件夹下有它的主页文件&#xff1a; 漏洞复现 nginx在遇到后缀名有php的文件时&#xff0c;…...

.NET之后,再无大创新

回想起来&#xff0c;2001年发布的.NET已经是距离最近的一次软件开发技术的整体创新了&#xff0c;后续的新技术就没有在各个端都这么成功的了。.NET是Windows平台下软件开发技术的巨大变革。在此之前&#xff0c;有VB、C&#xff08;MFC&#xff09;、JSP&#xff0c;在此之后…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...