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

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 os


def center_window(root, width, height):
    # 获取屏幕宽高
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    # 计算窗口左上角坐标
    x = (screen_width - width) // 2
    y = (screen_height - height) // 2
    # 设置窗口位置
    root.geometry(f'{width}x{height}+{x}+{y}')


def count_files_with_extension(folder_path, extension1 , extension2):
    count = 0
    path = Path(folder_path)
    # 获取路径下的所有文件并打印文件名称
    for f in path.iterdir():
        if f.is_file():
            full_path = os.path.join(folder_path, f)
            source_name = full_path
            if source_name.endswith(extension1) or source_name.endswith(extension2):
                count += 1

    return count

def 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('错误', '图片目录未选择')
        return
    if img_quality.strip() == "":
        showerror('错误', '压缩质量未设置')
        return
    try:
        img_quality = int(img_quality)
    except:
        showerror('错误', '压缩质量只能是整数')
        return
    if img_quality < 0 or img_quality > 100:
        showerror('错误', '压缩质量在0-100之间')
        return


    def 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 = 0
            total = 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_path
       

            append_log("作业压缩完成,存储:" + out_dir)
            btn_start.config(state=tk.NORMAL)
            btn_start.config(text="开始压缩")
            showinfo('提示', '恭喜! 图片压缩完成!')
        except Exception as e:
            import logging
            logging.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 = 20


hint = 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.kler.cn/a/391763.html

相关文章:

  • 重构代码之内联临时变量
  • gdb编译教程(支持linux下X86和ARM架构)
  • 使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能
  • 设计模式-七个基本原则之一-迪米特法则 + 案例
  • EasyExcel 使用多线程按顺序导出数据
  • ffmpeg内存模型
  • SpringBoot项目快速打包成jar项目与部署
  • 深入浅出《钉钉AI》产品体验报告
  • Spring Boot编程训练系统:架构设计精要
  • 虚拟机linux7.9下安装mysql遇到的问题
  • 计算机低能儿从0刷leetcode | 36.有效的数独
  • 【数学二】线性代数-向量-正交规范化、正交矩阵
  • 一篇文章学会ES6 Promise
  • 8 ARM-PEG-FA由八个臂状结构的聚乙二醇(PEG)核心与叶酸(FA)分子通过化学连接而成
  • 什么是大数据治理?在企业数字化转型过程中有什么用?
  • PostgreSQL存储过程-pgAdmin
  • 命令行工具进阶指南
  • 【 AI写作鹅-注册安全分析报告-无验证方式导致安全隐患】
  • Flutter下拉刷新上拉加载的简单实现方式二
  • Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)
  • 【网络安全 | 甲方建设】DDOS 防范教程
  • 用AI绘画一周赚1W?怎么用AI绘画赚钱!
  • 数据驱动的投资分析:民锋科技的量化模型探索
  • WPF中MVVM工具包 CommunityToolkit.Mvvm
  • IOT物联网低代码可视化大屏解决方案汇总
  • 推荐一个Star超过2K的.Net轻量级的CMS开源项目