Python编程:使用PIL进行JPEG图像压缩的简易教程

news2024/11/28 5:38:54

摘要: 本文介绍了如何使用Python编程语言和wxPython图形用户界面库进行JPEG图像的压缩。通过添加滑块控件,我们可以调整压缩质量,并将压缩后的照片另存为原来的名称加上后缀"压缩+质量数字"的新文件。
C:\pythoncode\new\image2small.py
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


完整代码:

import wx
import os
from PIL import Image


class ImageCompressor(wx.Frame):
    def __init__(self, parent, title):
        super(ImageCompressor, self).__init__(parent, title=title, size=(400, 250))

        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        self.file_picker = wx.FilePickerCtrl(panel, message="选择照片", wildcard="JPEG files (*.jpg)|*.jpg",
                                             style=wx.FLP_USE_TEXTCTRL)
        vbox.Add(self.file_picker, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)

        self.quality_slider = wx.Slider(panel, value=95, minValue=0, maxValue=99, style=wx.SL_HORIZONTAL)
        vbox.Add(self.quality_slider, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)

        compress_button = wx.Button(panel, label="Compress")
        compress_button.Bind(wx.EVT_BUTTON, self.on_compress)
        vbox.Add(compress_button, proportion=1, flag=wx.ALIGN_CENTER | wx.ALL, border=10)

        panel.SetSizer(vbox)
        self.Center()

    def on_compress(self, event):
        file_path = self.file_picker.GetPath()
        if file_path:
            image = Image.open(file_path)
            compressed_image = image.copy()

            # 获取原始文件的目录和文件名
            directory, filename = os.path.split(file_path)
            # 获取滑块的值作为压缩质量
            quality = self.quality_slider.GetValue()
            # 在文件名中添加后缀"_压缩+质量"
            compressed_filename = os.path.splitext(filename)[0] + f"_压缩{quality}.jpg"
            # 将压缩后的图像另存为新文件
            compressed_image.save(os.path.join(directory, compressed_filename), "JPEG", quality=quality)

            wx.MessageBox("照片已压缩并另存为:" + compressed_filename, "压缩成功", wx.OK | wx.ICON_INFORMATION)


if __name__ == '__main__':
    app = wx.App()
    frame = ImageCompressor(None, "Image Compressor")
    frame.Show()
    app.MainLoop()

在现代社交媒体和互联网时代,照片的分享和传输已经成为我们生活中的重要组成部分。然而,高分辨率的照片文件经常会占用大量的存储空间和带宽,限制了它们在网络上的传输速度和可用性。为了解决这个问题,图像压缩成为了一种常见的解决方案。

本文将介绍如何使用Python编程语言和wxPython图形用户界面库,通过简单的几行代码实现JPEG图像的压缩功能。我们还将加入一个滑块控件,使用户可以自定义压缩质量,并将压缩后的照片另存为原始文件名加上后缀"压缩+质量数字"的新文件。

准备工作

在开始之前,确保您已经安装了Python和wxPython库。可以使用pip命令进行安装:

pip install wxPython

此外,我们还需要安装Python的图像处理库Pillow:

pip install Pillow

编写代码

我们首先导入所需的库:

import wx
import os
from PIL import Image

然后,我们创建一个ImageCompressor类作为我们的应用程序窗口,并设置基本的界面元素,包括文件选择器和滑块控件。

class ImageCompressor(wx.Frame):
    def __init__(self, parent, title):
        super(ImageCompressor, self).__init__(parent, title=title, size=(400, 250))

        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        self.file_picker = wx.FilePickerCtrl(panel, message="选择照片", wildcard="JPEG files (*.jpg)|*.jpg",
                                             style=wx.FLP_USE_TEXTCTRL)
        vbox.Add(self.file_picker, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)

        self.quality_slider = wx.Slider(panel, value=95, minValue=0, maxValue=99, style=wx.SL_HORIZONTAL)
        vbox.Add(self.quality_slider, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)

        compress_button = wx.Button(panel, label="Compress")
        compress_button.Bind(wx.EVT_BUTTON, self.on_compress)
        vbox.Add(compress_button, proportion=1, flag=wx.ALIGN_CENTER | wx.ALL, border=10)

        panel.SetSizer(vbox)
        self.Center()

on_compress方法中,我们获取用户选择的图像文件路径,并使用Pillow库打开图像。

def on_compress(self, event):
    file_path = self.file_picker.GetPath()
    if file_path:
        image = Image.open(file_path)
        compressed_image = image.copy()

接下来,我们获取滑块的值作为压缩质量,并构造新的文件名。

        directory, filename = os.path.split(file_path)
        quality = self.quality_slider.GetValue()
        compressed_filename = os.path.splitext(filename)[0] + f"_压缩{quality}.jpg"

最后,我们将压缩后的图像另存为新文件。

        compressed_image.save(os.path.join(directory, compressed_filename), "JPEG", quality=quality)

运行程序

在主程序中,我们创建一个应用程序实例,并显示窗口。

if __name__ == '__main__':
    app = wx.App()
    frame = ImageCompressor(None, "Image Compressor")
    frame.Show()
    app.MainLoop()

运行程序后,您将看到一个简单的窗口,可以选择JPEG图像文件并通过滑块控制压缩质量。点击"Compress"按钮后,程序将压缩选中的图像,并另存为原始文件名加上后缀"_压缩+质量"的新文件。

结论

本文介绍了如何使用Python和wxPython库进行JPEG图像压缩的简易教程。通过添加滑块控件,我们可以方便地调整压缩质量,并将压缩后的照片另存为新文件。这种方法可以帮助我们在保持图像质量的同时,减小文件大小,提高图像在网络上的传输速度和可用性。

通过了解和掌握这种简单的图像压缩技术,我们可以更好地处理和分享照片,提高工作效率和用户体验。希望本文对您学习和使用Python进行图像处理有所帮助。

请注意,本文只是一个简单的示例,您可以根据自己的需求进行进一步的定制和扩展。祝您在图像处理的旅程中取得成功!

参考链接:

  • wxPython Documentation
  • Pillow Documentation

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

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

相关文章

AI编程助手 Amazon CodeWhisperer 全面解析与实践

目录 引言Amazon CodeWhisperer简介智能编程助手智能代码建议代码自动补全 提升代码质量代码质量提升安全性检测 支持多平台多语言 用户体验和系统兼容性用户体验文档和学习资源个性化体验系统兼容性 功能全面性和代码质量功能全面性代码生成质量和代码安全性 CodeWhisperer的代…

程序启动-大数据平台搭建

1、启动zookeeper集群 /home/cluster/zookeeper.sh start /home/cluster/zookeeper.sh stop 2、启动hadoop和yarn集群 /home/cluster/hadoop-3.3.6/sbin/start-dfs.sh /home/cluster/hadoop-3.3.6/sbin/start-yarn.sh /home/cluster/hadoop-3.3.6/sbin/stop-dfs.sh /home/clust…

以太坊代币标准ERC20、ERC165、ERC721

两个概念 ERC(Ethereum Request for Comment) 以太坊意见征集稿EIP(Ethereum Improvement Proposals)以太坊改进提案 ERC和EIP用于使得以太坊更加完善;在ERC中提出了很多标准,用的最多的标准就是它的Token标准; 有哪些标准详细见https://eips.ethereum…

预制菜行业数据分析(京东数据挖掘)

最近一段时间,关于预制菜进校园事件的讨论热度高涨。而这两天,核酸大王“张核子”转行开预制菜公司卖方便米饭的消息又被传出,直接让预制菜市场饱受关注。 “预制菜是近两年的风口”,这个结论鲸参谋早在以往的内容中专门讨论过&a…

Java 18的未来:新特性和编程实践

文章目录 引言新特性预览1. 基于值的类的进一步改进2. 模式匹配的增强3. 新的垃圾回收器4. 扩展的模块系统5. 更强大的异步编程 编程实践示例1:基于值的类示例2:模式匹配的增强示例3:新的垃圾回收器 结论 🎉欢迎来到Java学习路线专…

python机器学习融合模型:Stacking与Blending(附代码)

1 堆叠法Stacking 一套弱系统能变成一个强系统吗? 当你处在一个复杂的分类问题面前时,金融市场通常会出现这种情况,在搜索解决方案时可能会出现不同的方法。 虽然这些方法可以估计分类,但有时候它们都不比其他分类好。在这种情况…

[WUSTCTF2020]颜值成绩查询 布尔注入二分法

这道题很简单 就是sql注入 我们来学习一下如何写盲注脚本 ?stunum1 ?stunum123 正确回显 100 错误 显示 not 。。。 这里很显然就是盲注了 我们来写个语句查询 if(ascii(substr(database(),1,1))>1,1,0)发现回显了 我们可以开始编写脚本跑了 import requests impor…

DeepMind 利用无监督学习开发 AlphaMissense,预测 7100 万种基因突变

类基因组共有 31.6 亿个碱基对,无时无刻不在经历复制、转录和翻译,也随时有着出错突变的风险。 错义突变是基因突变中的一种常见形式,然而人类目前只观察到了其中的一小部分,能够解读的更是只有 0.1%。 准确预测错义突变的作用&am…

Windows10/11显示文件扩展名 修改文件后缀名教程

前言 写这篇文章的原因是由于我分享的教程中的文件、安装包基本都是存在阿里云盘的,下载后需要改后缀名才能使用。 但是好多同学不会改。。 Windows 10 随便打开一个文件夹,在上方工具栏点击 “查看”点击 “查看” 后下方会显示更详细的工具栏然后点…

剪映软件专业版的操作与使用,电脑版与手机版APP同步讲解

一、教程描述 什么是剪映?抖音官方推出的一款视频编辑工具,用于短视频的剪辑制作和在线发布,主要在手机端使用,同时支持PC端,操作简单易上手,功能也十分强大,使用过剪映的用户,都将…

ViT细节与代码解读

最近看到两篇解读ViT很好的文章,备忘记录一下: 先理解细节 1:再读VIT,还有多少细节是你不知道的 再理解代码 1:ViT源码阅读-PyTorch - 知乎

此芯科技加入百度飞桨硬件生态共创计划,加速端侧AI生态布局

近日,此芯科技(上海)有限公司(以下简称“此芯科技”)与百度签署硬件生态共创计划合作协议,正式加入由百度发起的硬件生态共创计划。双方将共同推动端侧AI和大模型在个人计算、车载计算以及元宇宙计算等领域…

Spring中是否可以存在两个相同ID的bean

文章目录 一、在同一个xml配置文件里配置两个相同ID的bean结论验证过程源码 二、在不同xml配置文件里配置两个相同ID的bean结论验证过程源码 三、在同一个配置类中以Bean方式添加两个名称相同的bean结论验证过程源码 四、在不同配置类中以Bean方式添加两个名称相同的bean结论验…

基础设施建设-企业级全栈测试平台的最佳实践

QECon(Quality Efficiency Conference)质量效能大会在上海正式开幕!本次大会以"数生智慧:高质量发展新引擎"为主题,深入探讨如何借助数字化和智能化技术推动软件质量的发展,为高质量经济发展提供…

华为云,让AI算力入山河

整个2023年,全球科技界都在为大模型沸腾。云计算产业作为AI大模型与产业场景间的最短路径,自然也在大模型浪潮中备受关注。目前阶段,云厂商已经纷纷入局大模型,从多个角度探索大模型带给云计算产业的可能性。 但我们往往会忽略这样…

【开发篇】八、SpringBoot整合MongoBD

文章目录 1、整合2、简单示例3、一点思考4、MongoDB的安装5、MongoDB的CRUD语法 1、整合 导入MongoBD的起步依赖:(这个starter背后是MongoDB的驱动和其他依赖,在这儿也可以看出命名的规律,redis的就是spring-boot-starter-data-r…

【数据结构-图】并查集

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

接口测试主要测试哪方面?需要哪些技能?要怎么学习?

1、什么是接口测试? 定义:测试系统组件间接口的一种测试。主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点,重点是检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 目的&#x…

选择合适的外贸公司邮箱注册服务提供商

随着全球化的发展,越来越多的企业开始涉足外贸领域。而在进行外贸业务时,邮箱是必不可少的工具之一。对于外贸公司来说,应该选择哪家邮箱服务提供商呢?口碑好安全性高的公司邮箱有Zoho Mail、阿里邮箱、腾讯邮箱、网易邮箱等。 首…

Spring cloud Sentinel介绍和安装

Sentinel介绍和安装 🌈初识Sentinel🌈安装Sentinel🌠docker 安装🌠下载sentinel镜像🌠启动sentinel镜像 🌠windows 安装🌠下载🌠运行 🌠sentinel访问 🌈微服务…