小庚资源网 · 免费提供绿色软件、活动线报以及其他网络资源,好货不私藏!
当前位置:网站首页 > 网站源码 > 只有源码 >正文

图片体积压缩工具源码

作者:小编日期:2026-01-19浏览:4888分类:只有源码

               因为工作需要,需要压缩图片的大小,基本都是小于100K的,就压缩体积,用不着其他的功能,于是就有了这个代码,也可以自定义压缩多大,但是不那么精确,还导入多张图片

image.png

  1. import tkinter as tk

  2. from tkinter import filedialog, messagebox

  3. from PIL import Image

  4. import os


  5. class ImageCompressor:

  6.     def __init__(self, root):

  7.         self.root = root

  8.         self.root.title("图片压缩工具 - 目标大小: 100KB以内")

  9.         self.root.geometry("500x400")

  10.          

  11.         self.target_size = tk.IntVar(value=100)

  12.         self.create_widgets()


  13.     def create_widgets(self):

  14.         target_frame = tk.Frame(self.root)

  15.         target_frame.pack(pady=5)

  16.          

  17.         tk.Label(target_frame, text="目标大小 (KB):").pack(side=tk.LEFT)

  18.         self.target_size_entry = tk.Entry(target_frame, width=10, textvariable=self.target_size)

  19.         self.target_size_entry.pack(side=tk.LEFT, padx=5)

  20.          

  21.         tk.Button(target_frame, text="设置", command=self.set_target_size).pack(side=tk.LEFT)

  22.          

  23.         self.select_btn = tk.Button(self.root, text="选择图片", command=self.select_images)

  24.         self.select_btn.pack(pady=10)

  25.         self.file_label = tk.Label(self.root, text="未选择图片", wraplength=400)

  26.         self.file_label.pack(pady=5)


  27.         self.compress_btn = tk.Button(self.root, text="开始压缩", command=self.compress_images, state=tk.DISABLED)

  28.         self.compress_btn.pack(pady=10)


  29.         self.progress_label = tk.Label(self.root, text="")

  30.         self.progress_label.pack(pady=5)


  31.         self.result_text = tk.Text(self.root, height=10, width=60)

  32.         self.result_text.pack(pady=10)


  33.         self.clear_btn = tk.Button(self.root, text="清空结果", command=self.clear_results)

  34.         self.clear_btn.pack(pady=5)


  35.         self.image_paths = []

  36.      

  37.     def set_target_size(self):

  38.         """设置目标压缩大小"""

  39.         try:

  40.             size = int(self.target_size.get())

  41.             if size <= 0:

  42.                 messagebox.showerror("错误", "目标大小必须大于0KB")

  43.                 return

  44.             if size > 10000:  

  45.                 messagebox.showwarning("警告", "目标大小过大,建议设置一个小于10MB的值")

  46.             

  47.             self.root.title(f"图片压缩工具 - 目标大小: {size}KB以内")

  48.             messagebox.showinfo("成功", f"目标大小已设置为: {size}KB")

  49.         except ValueError:

  50.             messagebox.showerror("错误", "请输入有效的数字")


  51.     def select_images(self):

  52.         file_paths = filedialog.askopenfilenames(

  53.             title="选择要压缩的图片",

  54.             filetypes=[

  55.                 ("Image files", "*.jpg *.jpeg *.png *.bmp *.tiff *.webp"),

  56.                 ("All files", "*.*")

  57.             ]

  58.         )

  59.          

  60.         if file_paths:

  61.             self.image_paths = list(file_paths)

  62.             self.file_label.config(text=f"已选择 {len(self.image_paths)} 张图片")

  63.             self.compress_btn.config(state=tk.NORMAL)

  64.             self.result_text.insert(tk.END, f"已选择 {len(self.image_paths)} 张图片\n")

  65.             for path in self.image_paths:

  66.                 self.result_text.insert(tk.END, f"- {path}\n")


  67.     def compress_images(self):

  68.         if not self.image_paths:

  69.             messagebox.showerror("错误", "请选择至少一张图片")

  70.             return


  71.         total_images = len(self.image_paths)

  72.         success_count = 0

  73.          

  74.         for i, image_path in enumerate(self.image_paths):

  75.             try:

  76.                 self.progress_label.config(text=f"正在处理第 {i+1}/{total_images} 张图片...")

  77.                 self.root.update()

  78.                  

  79.                 original_size = os.path.getsize(image_path) / 1024

  80.                 self.result_text.insert(tk.END, f"\n处理图片: {os.path.basename(image_path)}\n")

  81.                 self.result_text.insert(tk.END, f"原始大小: {original_size:.2f} KB\n")


  82.                 img = Image.open(image_path)


  83.                 if img.mode in ('RGBA', 'LA', 'P'):

  84.                     img = img.convert('RGB')


  85.                 output_path = self.generate_output_path_batch(image_path)


  86.                 quality = 95


  87.                 while True:

  88.                     img.save(output_path, "JPEG", optimize=True, quality=quality)


  89.                     compressed_size = os.path.getsize(output_path) / 1024

  90.                      

  91.                     self.progress_label.config(text=f"正在处理: {os.path.basename(image_path)}, 当前质量: {quality}, 大小: {compressed_size:.2f}KB")

  92.                     self.root.update()


  93.                     if compressed_size <= self.target_size.get() or quality <= 10:

  94.                         break


  95.                     if compressed_size > self.target_size.get() * 1.5:

  96.                         quality -= 15

  97.                     elif compressed_size > self.target_size.get() * 1.2:

  98.                         quality -= 8

  99.                     else:

  100.                         quality -= 5

  101.                      

  102.                     quality = max(quality, 10)


  103.                 final_size = os.path.getsize(output_path) / 1024

  104.                 self.result_text.insert(tk.END, f"最终质量: {quality}, 最终大小: {final_size:.2f} KB\n")

  105.                  

  106.                 if final_size <= self.target_size.get():

  107.                     self.result_text.insert(tk.END, f"&#9989; 压缩成功! 文件已保存至: {output_path}\n")

  108.                     success_count += 1

  109.                 else:

  110.                     self.result_text.insert(tk.END, f"&#9888;&#65039; 无法压缩到{self.target_size.get()}KB以下,最低压缩到: {final_size:.2f} KB\n")

  111.                  

  112.                 self.root.update()

  113.                  

  114.             except Exception as e:

  115.                 self.result_text.insert(tk.END, f"&#10060; 压缩失败: {str(e)}\n")

  116.                 messagebox.showerror("错误", f"压缩过程中出现错误: {str(e)}")

  117.          

  118.         self.progress_label.config(text="完成!")

  119.         messagebox.showinfo("完成", f"批量压缩完成!\n总共处理: {total_images} 张图片\n成功压缩: {success_count} 张图片\n无法压缩到{self.target_size.get()}KB以下: {total_images - success_count} 张图片")


  120.     def generate_output_path_batch(self, input_path):

  121.         """为批量处理生成输出文件路径"""

  122.         base_name, ext = os.path.splitext(input_path)

  123.         counter = 1

  124.         while True:

  125.             output_path = f"{base_name}_compressed_{counter}.jpg"

  126.             if not os.path.exists(output_path):

  127.                 return output_path

  128.             counter += 1


  129.     def generate_output_path(self):

  130.         """生成输出文件路径"""

  131.         base_name, ext = os.path.splitext(self.image_path)

  132.         counter = 1

  133.         while True:

  134.             output_path = f"{base_name}_compressed_{counter}.jpg"

  135.             if not os.path.exists(output_path):

  136.                 return output_path

  137.             counter += 1


  138.     def clear_results(self):

  139.         self.result_text.delete(1.0, tk.END)


  140.     def compress_image(self):

  141.         pass


  142. if __name__ == "__main__":

  143.     root = tk.Tk()

  144.     app = ImageCompressor(root)

  145.     root.mainloop()


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

取消回复欢迎发表评论:

Copyright© XGW9.COM版权所有〖小庚资源网〗
〖恒创科技〗为本站提供专业云计算服务  
本站发布的内容来源于互联网,如果有侵权内容,请联系我们删除!E-mail:xgzyw6@outlook.com
关于我们|我要投稿|免责声明|XML地图