图片体积压缩工具源码
作者:小编日期:2026-01-19浏览:4968分类:只有源码
因为工作需要,需要压缩图片的大小,基本都是小于100K的,就压缩体积,用不着其他的功能,于是就有了这个代码,也可以自定义压缩多大,但是不那么精确,还导入多张图片
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image
import os
class ImageCompressor:
def __init__(self, root):
self.root = root
self.root.title("图片压缩工具 - 目标大小: 100KB以内")
self.root.geometry("500x400")
self.target_size = tk.IntVar(value=100)
self.create_widgets()
def create_widgets(self):
target_frame = tk.Frame(self.root)
target_frame.pack(pady=5)
tk.Label(target_frame, text="目标大小 (KB):").pack(side=tk.LEFT)
self.target_size_entry = tk.Entry(target_frame, width=10, textvariable=self.target_size)
self.target_size_entry.pack(side=tk.LEFT, padx=5)
tk.Button(target_frame, text="设置", command=self.set_target_size).pack(side=tk.LEFT)
self.select_btn = tk.Button(self.root, text="选择图片", command=self.select_images)
self.select_btn.pack(pady=10)
self.file_label = tk.Label(self.root, text="未选择图片", wraplength=400)
self.file_label.pack(pady=5)
self.compress_btn = tk.Button(self.root, text="开始压缩", command=self.compress_images, state=tk.DISABLED)
self.compress_btn.pack(pady=10)
self.progress_label = tk.Label(self.root, text="")
self.progress_label.pack(pady=5)
self.result_text = tk.Text(self.root, height=10, width=60)
self.result_text.pack(pady=10)
self.clear_btn = tk.Button(self.root, text="清空结果", command=self.clear_results)
self.clear_btn.pack(pady=5)
self.image_paths = []
def set_target_size(self):
"""设置目标压缩大小"""
try:
size = int(self.target_size.get())
if size <= 0:
messagebox.showerror("错误", "目标大小必须大于0KB")
return
if size > 10000:
messagebox.showwarning("警告", "目标大小过大,建议设置一个小于10MB的值")
self.root.title(f"图片压缩工具 - 目标大小: {size}KB以内")
messagebox.showinfo("成功", f"目标大小已设置为: {size}KB")
except ValueError:
messagebox.showerror("错误", "请输入有效的数字")
def select_images(self):
file_paths = filedialog.askopenfilenames(
title="选择要压缩的图片",
filetypes=[
("Image files", "*.jpg *.jpeg *.png *.bmp *.tiff *.webp"),
("All files", "*.*")
]
)
if file_paths:
self.image_paths = list(file_paths)
self.file_label.config(text=f"已选择 {len(self.image_paths)} 张图片")
self.compress_btn.config(state=tk.NORMAL)
self.result_text.insert(tk.END, f"已选择 {len(self.image_paths)} 张图片\n")
for path in self.image_paths:
self.result_text.insert(tk.END, f"- {path}\n")
def compress_images(self):
if not self.image_paths:
messagebox.showerror("错误", "请选择至少一张图片")
return
total_images = len(self.image_paths)
success_count = 0
for i, image_path in enumerate(self.image_paths):
try:
self.progress_label.config(text=f"正在处理第 {i+1}/{total_images} 张图片...")
self.root.update()
original_size = os.path.getsize(image_path) / 1024
self.result_text.insert(tk.END, f"\n处理图片: {os.path.basename(image_path)}\n")
self.result_text.insert(tk.END, f"原始大小: {original_size:.2f} KB\n")
img = Image.open(image_path)
if img.mode in ('RGBA', 'LA', 'P'):
img = img.convert('RGB')
output_path = self.generate_output_path_batch(image_path)
quality = 95
while True:
img.save(output_path, "JPEG", optimize=True, quality=quality)
compressed_size = os.path.getsize(output_path) / 1024
self.progress_label.config(text=f"正在处理: {os.path.basename(image_path)}, 当前质量: {quality}, 大小: {compressed_size:.2f}KB")
self.root.update()
if compressed_size <= self.target_size.get() or quality <= 10:
break
if compressed_size > self.target_size.get() * 1.5:
quality -= 15
elif compressed_size > self.target_size.get() * 1.2:
quality -= 8
else:
quality -= 5
quality = max(quality, 10)
final_size = os.path.getsize(output_path) / 1024
self.result_text.insert(tk.END, f"最终质量: {quality}, 最终大小: {final_size:.2f} KB\n")
if final_size <= self.target_size.get():
self.result_text.insert(tk.END, f"✅ 压缩成功! 文件已保存至: {output_path}\n")
success_count += 1
else:
self.result_text.insert(tk.END, f"⚠️ 无法压缩到{self.target_size.get()}KB以下,最低压缩到: {final_size:.2f} KB\n")
self.root.update()
except Exception as e:
self.result_text.insert(tk.END, f"❌ 压缩失败: {str(e)}\n")
messagebox.showerror("错误", f"压缩过程中出现错误: {str(e)}")
self.progress_label.config(text="完成!")
messagebox.showinfo("完成", f"批量压缩完成!\n总共处理: {total_images} 张图片\n成功压缩: {success_count} 张图片\n无法压缩到{self.target_size.get()}KB以下: {total_images - success_count} 张图片")
def generate_output_path_batch(self, input_path):
"""为批量处理生成输出文件路径"""
base_name, ext = os.path.splitext(input_path)
counter = 1
while True:
output_path = f"{base_name}_compressed_{counter}.jpg"
if not os.path.exists(output_path):
return output_path
counter += 1
def generate_output_path(self):
"""生成输出文件路径"""
base_name, ext = os.path.splitext(self.image_path)
counter = 1
while True:
output_path = f"{base_name}_compressed_{counter}.jpg"
if not os.path.exists(output_path):
return output_path
counter += 1
def clear_results(self):
self.result_text.delete(1.0, tk.END)
def compress_image(self):
pass
if __name__ == "__main__":
root = tk.Tk()
app = ImageCompressor(root)
root.mainloop()
相关文章
- 04-28 2026新版海螺影视主题模板M3.1全解密版
- 04-28 仿3500游戏源码大气H5游戏门户网站模板源码_帝国CMS
- 04-28 最新资源站7B2-WP主题源码 - WordPress主题 附教程
- 04-28 仿玩游戏网源码大型游戏资讯门户网站源码 帝国CMS模板
- 04-28 苹果cms蓝色小鸟主题,简约响应式
- 04-26 苹果CMSv10 仿爱电影MizhiADY模板源码
- 04-26 仿爱客响应式模板 苹果CMSv10仿爱客响模板
- 04-26 某宝卖400的仿短视的自适应苹果cms模板
- 04-25 办公学习教程资讯类网站织梦模板源码 | DedeCMS
- 04-25 织梦仿小刀娱乐网模板资源资讯类网站模板(自适应手机端)
- 04-25 织梦素材站网站源码 资源付费下载交易平台源码
- 04-23 游戏攻略新闻资讯主题模板源码 YK一点资讯模版 Zblog主题模版
取消回复欢迎你发表评论:
- 协助本站优化一下
- 最近发表
- 1淘宝拍拍乐每天攒拍币兑红包
- 2拼多多连续签到14天必得9.9亓
- 3百度每天领取多张打车立减券
- 42026新版海螺影视主题模板M3.1全解密版
- 5仿3500游戏源码大气H5游戏门户网站模板源码_帝国CMS
- 6最新资源站7B2-WP主题源码 - WordPress主题 附教程
- 7仿玩游戏网源码大型游戏资讯门户网站源码 帝国CMS模板
- 8苹果cms蓝色小鸟主题,简约响应式
- 9Mirillis Action 屏幕录像 v4.48.1 破解便携版
- 10VueScan Pro 图像扫描 v9.8.53.09 中文破解版
- 11心跳大冒险:泰遇/Heartbeat in Thailand
- 12 【眼福最新】网红可可裸拍舞蹈小庚网专属福利来了 前10送实物福利
- 13【眼福】网红小希裸拍鸳鸯戏舞蹈小庚网专属福利
- 14月鼠小说V5.0.8.1 海量热门小说资源
- 1586漫画V1.01 海量漫画尽情畅读
Copyright© XGW9.COM版权所有〖小庚资源网〗
〖恒创科技〗为本站提供专业云计算服务
本站发布的内容来源于互联网,如果有侵权内容,请联系我们删除!E-mail:xgzyw6@outlook.com
关于我们|我要投稿|免责声明|XML地图











暂无评论,来添加一个吧。