PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸

小编最近有一篇png图片要批量压缩,大小都在5MB之上,在网上找了半天要么就是有广告,要么就是有毒,要么就是功能复杂,整的我心烦意乱。

于是我自己用python写了一个纯净工具,只能压缩png图片,没任何广告。在windwos平台上使用。

指定的压缩质量:40

压缩前图片大小

压缩后图片大小

可以看到图片从5MB压缩到了 500KB。指定的质量还是降低,压缩尺寸效果还可以更大。

压缩前和压缩后图片对比

压缩前,大小5.7MB:

压缩后,大小861KB:

使用视频教程

png压缩

代码采用python编写,打包成了exe, 文件目录:

直接运行这个 "批量压缩png图片.exe" 即可。

下载地址:

https://gitee.com/lz-code/soft.git

部分代码展示

import tkinter as tk
from tkinter.filedialog import askdirectory
from tkinter.messagebox import *
import datetime
import _thread
from pathlib import Path
import osdef center_window(root, width, height):# 获取屏幕宽高screen_width = root.winfo_screenwidth()screen_height = root.winfo_screenheight()# 计算窗口左上角坐标x = (screen_width - width) // 2y = (screen_height - height) // 2# 设置窗口位置root.geometry(f'{width}x{height}+{x}+{y}')def count_files_with_extension(folder_path, extension1 , extension2):count = 0path = Path(folder_path)# 获取路径下的所有文件并打印文件名称for f in path.iterdir():if f.is_file():full_path = os.path.join(folder_path, f)source_name = full_pathif source_name.endswith(extension1) or source_name.endswith(extension2):count += 1return countdef open_img_dir(edit):path_ = askdirectory()  # 使用askdirectory()方法返回文件夹的路径if path_ == "":pass# showerror('错误', '图片目录未选择')else:edit.insert(0,path_)def start_compress(entry_dir,entry_quality):img_dir = entry_dir.get()img_quality = entry_quality.get()if img_dir.strip() == "":showerror('错误', '图片目录未选择')returnif img_quality.strip() == "":showerror('错误', '压缩质量未设置')returntry:img_quality = int(img_quality)except:showerror('错误', '压缩质量只能是整数')returnif img_quality < 0 or img_quality > 100:showerror('错误', '压缩质量在0-100之间')returndef run(img_dir,img_quality):try:## 输出路径out_dir = img_dir+"/out"append_log("创建输入路径:" + out_dir)if not os.path.exists(out_dir):os.mkdir(out_dir)path = Path(img_dir)count = 0total = count_files_with_extension(img_dir,"png","PNG")btn_start.config(text="压缩中 0/"+str(total))btn_start.config(state=tk.DISABLED)# 获取路径下的所有文件并打印文件名称for f in path.iterdir():if f.is_file():full_path = os.path.join(img_dir, f)source_name = full_pathappend_log("作业压缩完成,存储:" + out_dir)btn_start.config(state=tk.NORMAL)btn_start.config(text="开始压缩")showinfo('提示', '恭喜! 图片压缩完成!')except Exception as e:import logginglogging.exception(e)append_log(str(e))btn_start.config(state=tk.NORMAL)btn_start.config(text="开始压缩")_thread.start_new_thread(run , (img_dir,img_quality))def append_log(log):current_time = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S")log = "["+current_time+"]# " + log + "\n"text.insert(tk.END, log + "\n")text.see(tk.END)root = tk.Tk()
root.title("批量PNG压缩 by 【轻量小工具工作室*QQ:3571289092】")
window_width = 500
window_height = 500
center_window(root, window_width, window_height)uiHeight = 30
padding = 20hint = tk.Label(root, text="                   ★★★ 无收费,无广告,无毒,自主研发,联系开发可定制 ★★★")
hint.place(x=padding, y=0, width=400, height=uiHeight)hint2 = tk.Label(root, text="压缩质量")
hint2.place(x=padding, y=uiHeight+padding, width=100, height=uiHeight)entry_quality=tk.Entry(root,bd=2)
entry_quality.place(x=padding+100, y=uiHeight+padding, width=100, height=uiHeight)
entry_quality.insert(0,40)hint2 = tk.Label(root, text="0[差]-100[好]")
hint2.place(x=2*padding+2*100, y=uiHeight+padding, width=80, height=uiHeight)hint2 = tk.Label(root, text="PNG图片路径 ")
hint2.place(x=padding, y=2*uiHeight+2*padding, width=100, height=uiHeight)entry_dir=tk.Entry(root,bd=2)
entry_dir.place(x=padding+100, y=2*uiHeight+2*padding, width=300, height=uiHeight)btn = tk.Button(root, text ="选择...", command=lambda :open_img_dir(entry_dir))
btn.place(x=2*padding+100+300, y=2*uiHeight+2*padding, width=50, height=uiHeight)btn_start = tk.Button(root, text ="开始压缩", command=lambda :start_compress(entry_dir,entry_quality))
btn_start.place(x=padding+100, y=3*uiHeight+3*padding, width=150, height=uiHeight)## 滚动的日志text = tk.Text(root , bg='black', fg='white')
scrollbar = tk.Scrollbar(root, command=text.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar.place(x=500-padding, y=4*uiHeight+4*padding, width=10, height=uiHeight)
text.place(x=padding, y=4*uiHeight+4*padding, width=500-2*padding, height=280)root.mainloop()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试工程师简历「精选篇」

【#测试工程师简历#】一份专业且引人注目的测试工程师简历&#xff0c;无疑是你敲开理想职位大门的金钥匙。那么&#xff0c;如何撰写一份既体现技术水平又彰显个人特色的简历呢&#xff1f;以下是幻主简历网整理的测试工程师简历「程序员篇」&#xff0c;欢迎大家阅读收藏&…

git下载慢下载不了?Git国内国外下载地址镜像,git安装视频教程

git安装下载的视频教程在这 3分钟完成git下载和安装&#xff0c;git国内外下载地址镜像&#xff0c;Windows为例_哔哩哔哩_bilibili 一、Git安装包国内和国外下载地址镜像 1.1国外官方下载地址 打开Git的官方网站&#xff1a;Git官网下载页面。在页面上选择对应的系统&…

专题十八_动态规划_斐波那契数列模型_路径问题_算法专题详细总结

目录 动态规划 动态规范五步走&#xff1a; 1. 第 N 个泰波那契数&#xff08;easy&#xff09; 解析&#xff1a; 1.状态表达式&#xff1a; 2.状态转移方程&#xff1a; 3.初始化&#xff1a; 4.填表顺序&#xff1a; 5.返回值 编写代码&#xff1a; 总结&#xff…

阿里云centos7.9服务器磁盘挂载,切换服务路径

项目背景 1、项目使用的服务器为阿里云centos7.9&#xff0c;默认的磁盘为vda&#xff0c;文件系统挂载在这个磁盘上&#xff0c;项目上使用的文件夹为/home/hnst/uploadPath 2、vda使用率已达到91% 3、现购置一块新的磁盘为vdb&#xff0c;大小为2T 目的 切换服务所使用的…

STM32问题集

这里写目录标题 一、烧录1、 Can not connect to target!【ST-LINK烧录】 一、烧录 1、 Can not connect to target!【ST-LINK烧录】 烧录突然 If the target is in low power mode, please enable “Debug in Low Power mode” option from Target->settings menu 然后就&…

Scala学习记录,case class,迭代器

case class case class创建的对象的属性是不可改的 创建对象&#xff0c;可以不用写new 自动重写&#xff1a;toString, equals, hashCode, copy 自动重写方法&#xff1a;toString,equals,hashCode,copy 小习一下 1.case class 的定义语法是什么 基本形式&#xff1a;case …

成都睿明智科技有限公司解锁抖音电商新玩法

在这个短视频风起云涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家争夺的流量高地。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司犹如一颗璀璨的新星&#xff0c;以其专业的抖音电商服务&#xff0c;助力无数品牌实现从零…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势

目录 文献基本信息 序言 1 发展概况 2 重点技术发展 2.1 人工智能技术 2.1.1 应用深化 2.1.2 作战效能提升 2.2 航空技术 2.2.1螺旋桨设计创新 2.2.2 发射回收技术进步 2.3 其他相关技术 2.3.1 远程控制技术探 2.3.2 云地控制平台应用 3 装备系统进展 3.1 无人作…

LeetCode 86.分隔链表

题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 思路&#xff1a; 代码&#xff1a; /*** Definiti…

SystemVerilog学习笔记(六):控制流

条件语句 条件语句用于检查块中的语句是否被执行。条件语句创建语句块。如果给出的表达式是 true&#xff0c;执行块中的语句集&#xff0c;如果表达式为 false&#xff0c;则 else 块语句将最后执行。 序号条件语句1.if2.if-else3.if-else ladder4.unique if5.unique0 if6.p…

SQL,力扣题目1127, 用户购买平台

一、力扣链接 LeetCode_1127 二、题目描述 支出表: Spending ---------------------- | Column Name | Type | ---------------------- | user_id | int | | spend_date | date | | platform | enum | | amount | int | ------------------…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理&#xff0c;请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注&#xff1a;本文基于《计算机网络》&#xff08;第5版&#xff09;吴功宜、吴英…

群控系统服务端开发模式-应用开发-前端个人信息功能

个人信息功能我把他分为了3部分&#xff1a;第一部分是展示登录者信息&#xff1b;第二步就是登录者登录退出信息&#xff1b;第三部分就是修改个人资料。 一、展示登录者信息 1、优先添加固定路由 在根目录下src文件夹下route文件夹下index.js文件中&#xff0c;添加如下代码 …

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

Java面向对象高级2

1.代码块 2.内部类 成员内部类 public class Demo{public static void main(String[] args) {outer.inner innew outer().new inner();in.run();}}class outer{private String str"outer";public class inner{public void run(){String sstr;System.out.println(s);…

Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)

作者&#xff1a;来自 Elastic Ranjana Devaji, Dana Juratoni Elasticsearch 8.16 引入了 BBQ&#xff08;Better Binary Quantization - 更好的二进制量化&#xff09;—— 一种压缩向量化数据的创新方法&#xff0c;其性能优于传统方法&#xff0c;例如乘积量化 (Product Qu…

androidstudio下载gradle慢

1&#xff0c;现象&#xff1a; 2&#xff0c;原因&#xff0c;国内到国外网址慢 3&#xff0c;解决方法&#xff1a;更改gradle-wrapper.properties #Wed Sep 26 20:01:52 CST 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 &#xff0c; 现实的漫游效果不是从摄像机的角度来看 &#xff0c; 但其仍然存在很多困难 。基于三维场景的视频融合 &#xff0c; 因其直观等特效在视频监控等相关领域有着…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

【算法一周目】双指针(2)

目录 有效三角形的个数 解题思路 C代码实现 和为s的两个数字 解题思路 C代码实现 三数之和 解题思路 C代码实现 四数之和 解题思路 C代码实现 有效三角形的个数 题目链接&#xff1a;611. 有效三角形的个数题目描述&#xff1a;给定一个包含非负整数的数组nums&…