小编最近有一篇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()