在服务器配置不够高时,为了提高网站访问速度,对图片进行压缩、格式修改和剪切操作是十分必要的。本文将介绍一款图片压缩工具,它能满足这些需求。

一、工具功能

  1. 自动压缩并转换格式
    • 此工具会自动将传入的照片根据入参压缩成webp格式。这种格式在保证一定图片质量的同时,能够显著减小图片大小,非常适合用于网页加载,有助于提高网站访问速度。
  2. 图片剪切功能(可选)
    • 如果需要做文章封面等操作,可以勾选“开启等比例缩放”选项(文中未提及,但推测是与剪切相关的操作),实现对图片的合理裁剪。

二、传图方式

  1. 选择本地图片
    • 直接点击工具界面上的“选择图片并压缩”按钮,即可从本地文件夹中选择需要处理的图片。操作简单直观,方便用户快速定位本地图片资源。
  2. 使用粘贴板传图
    • 支持直接使用 Ctrl + V快捷键。工具会自动获取粘贴板里的图片,无需用户手动保存再上传,大大提高了传图效率。

三、保存路径

  • 图片传入后,工具会自动处理并将处理完的图片保存在桌面。无需用户确认保存路径,简化了操作流程,节省了用户时间。

四、工具界面参数说明

  1. 压缩质量设置
    • 工具界面中有一个输入框,提示“请输入压缩质量(0 - 100,留空默认80)”。用户可以根据需要在0到100之间输入数值来调整图片的压缩质量。默认值为80,在保证图片质量和压缩率之间取得了较好的平衡。
  2. 目标分辨率设置
    • 还有一个输入框提示“请输入目标分辨率(宽度高度,留空默认1612921)”。用户可以自定义图片压缩后的目标分辨率,若留空则按照默认的1612*921分辨率进行压缩。

这款图片压缩工具在处理图片方面具有操作简单、功能实用的特点,无论是对于网站优化还是日常图片处理都非常有帮助。

源码:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageGrab
import io
import time
import os


def compress_image(event=None):
    try:
        quality_str = quality_entry.get().strip()
        if quality_str:
            try:
                quality = int(quality_str)
                if quality < 0 or quality > 100:
                    result_label.config(text="压缩质量参数应在0 - 100之间,请重新输入。")
                    return
            except ValueError:
                result_label.config(text="请输入有效的整数作为压缩质量参数。")
                return
        else:
            quality = 80  # 默认压缩质量

        target_resolution_str = resolution_entry.get().strip()
        if scale_checkbox_var.get() == 1 and target_resolution_str:
            try:
                target_width_str, target_height_str = target_resolution_str.split('*')
                target_width = int(target_width_str)
                target_height = int(target_height_str)
            except ValueError:
                result_label.config(text="请输入正确格式的分辨率参数(格式如:宽度*高度)。")
                return
        else:
            target_width = None
            target_height = None

        if event is None:  # 通过按钮点击触发,弹出文件选择对话框让用户选择图片
            file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
            if file_path:
                image = Image.open(file_path)
            else:
                return
        else:  # 通过Ctrl+V快捷键触发,处理粘贴板中的图片
            image_data = ImageGrab.grabclipboard()
            if image_data is not None:
                if isinstance(image_data, Image.Image):
                    image = image_data
                else:
                    image = Image.open(io.BytesIO(image_data))
            else:
                return

        # 图片转换为RGB模式
        image = image.convert('RGB')

        if target_width is not None and target_height is not None:
            width, height = image.size
            if width / height > target_width / target_height:
                new_height = int(height * target_width / width)
                new_width = target_width
            else:
                new_width = int(width * target_height / height)
                new_height = target_height
            image = image.resize((new_width, new_height), Image.ANTIALIAS)

        desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop') + os.path.sep
        file_name = f'lo_{time.strftime("%Y%m%d%H%M%S")}.webp'
        new_file_path = os.path.join(desktop_path, file_name)

        image.save(new_file_path, format='webp', quality=quality)
        result_label.config(text=f"图片已成功压缩并保存为: {new_file_path}")
    except Exception as e:
        result_label.config(text=f"操作失败: {e}")


# 创建主窗口
root = tk.Tk()
root.title("图片压缩工具")
root.geometry('400x380')

# 设置背景颜色和整体布局
root.configure(bg='#F4F7FB')

# 创建主框架,背景颜色和样式
main_frame = tk.Frame(root, bg='#FFFFFF', bd=0, relief=tk.SOLID, padx=20, pady=20)
main_frame.pack(padx=20, pady=20, fill=tk.BOTH, expand=True)

# 创建按钮,按钮样式现代化
compress_button = tk.Button(main_frame, text="选择图片并压缩", command=compress_image,
                            bg='#4CAF50', fg='white', font=('Arial', 12, 'bold'), relief=tk.RAISED, bd=3,
                            padx=20, pady=10, highlightthickness=0, activebackground='#45a049', activeforeground='white')
compress_button.pack(pady=15)

# 创建标签用于显示操作结果
result_label = tk.Label(main_frame, text="", bg='#FFFFFF', fg='black', font=('Arial', 10))
result_label.pack(pady=10)

# 创建输入框及对应标签,用于输入压缩质量参数
quality_label = tk.Label(main_frame, text="请输入压缩质量(0 - 100,留空默认80):",
                         bg='#FFFFFF', fg='black', font=('Arial', 10))
quality_label.pack(pady=5)

quality_entry = tk.Entry(main_frame, bg='#F4F7FB', fg='black', font=('Arial', 10), relief="solid", bd=1)
quality_entry.pack(pady=5)
quality_entry.insert(0, "80")  # 默认值

# 创建输入框及对应标签,用于输入目标分辨率
resolution_label = tk.Label(main_frame, text="请输入目标分辨率(宽度*高度,留空默认1612*921):",
                             bg='#FFFFFF', fg='black', font=('Arial', 10))
resolution_label.pack(pady=5)

resolution_entry = tk.Entry(main_frame, bg='#F4F7FB', fg='black', font=('Arial', 10), relief="solid", bd=1)
resolution_entry.pack(pady=5)
resolution_entry.insert(0, "1612*921")  # 默认值

# 创建复选框,控制是否开启等比例缩放功能
scale_checkbox_var = tk.IntVar()
scale_checkbox = tk.Checkbutton(main_frame, text="开启等比例缩放", variable=scale_checkbox_var,
                                bg='#FFFFFF', fg='black', font=('Arial', 10))
scale_checkbox.pack(pady=5)

# 绑定快捷键Ctrl+V触发压缩
root.bind("<Control-v>", compress_image)

# 运行主窗口事件循环
root.mainloop()