在为网站上传图片时,经常会遇到对图片文件大小和分辨率的限制。为了确保图片符合这些要求而不失质量,图片压缩工具成为不可或缺的好帮手。这类工具不仅能够有效减小文件体积,还能保持图像的清晰度,确保网页加载速度不受影响。
主要功能与优势:
1.智能压缩:利用先进的算法,在几乎不影响视觉效果的情况下减少图片文件的大小,确保图片符合网站的上传要求
2.格式转换:部分工具还提供格式转换功能,可以将图片转换为最适合网络使用的格式(如 JPEG、PNG 等多种图片格式),进一步优化文件大小。
3.自定义设置:允许用户调整压缩级别,根据具体需求平衡图片质量和文件大小。
4.即时预览:一些工具提供即时预览功能,让用户可以在压缩前后对比图片质量,确保最终效果满意。
代码源码在页面最下方,有需要的可以自行修改研究。
import os
import re
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PIL import Image, ImageTk, UnidentifiedImageError
import threading
import logging
# 设置日志配置
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
class ImageCompressorApp:
def __init__(self, root):
self.root = root
self.root.title("图片压缩工具 by ke")
self.root.geometry("1024x650")
self.root.configure(bg="#f0f0f0")
# 初始化变量
self.image_path = None # 图片路径
self.output_location = None # 输出位置
self.target_size_kb = tk.IntVar(value=400) # 默认目标大小为400KB
self.new_filename = tk.StringVar() # 新文件名
self.output_format = tk.StringVar(value="JPG") # 修改默认输出格式为JPG
# 创建界面元素
self.create_widgets()
def create_widgets(self):
main_frame = tk.Frame(self.root, bg="#f0f0f0")
main_frame.pack(expand=True, fill='both', padx=20, pady=20)
# 文件选择和预览
img_frame = tk.Frame(main_frame, bg="#f0f0f0")
img_frame.pack(fill='x')
self.img_label = tk.Label(img_frame, text="请加载一张图片", bg="#f0f0f0")
self.img_label.pack(side=tk.LEFT, padx=10, pady=10)
browse_button = tk.Button(img_frame, text="选择图片...", command=self.browse_files)
browse_button.pack(side=tk.RIGHT, padx=10, pady=10)
# 目标大小输入框
size_frame = tk.Frame(main_frame, bg="#f0f0f0")
size_frame.pack(fill='x', pady=5)
tk.Label(size_frame, text="目标大小 (KB):", bg="#f0f0f0").pack(side=tk.LEFT, padx=5)
self.size_entry = tk.Entry(size_frame, textvariable=self.target_size_kb, width=10)
self.size_entry.pack(side=tk.LEFT, padx=5)
# 设置新文件名
filename_frame = tk.Frame(main_frame, bg="#f0f0f0")
filename_frame.pack(fill='x', pady=5)
tk.Label(filename_frame, text="新文件名:", bg="#f0f0f0").pack(side=tk.LEFT, padx=5)
tk.Entry(filename_frame, textvariable=self.new_filename, width=30).pack(side=tk.LEFT, padx=5)
# 选择输出格式
format_frame = tk.Frame(main_frame, bg="#f0f0f0")
format_frame.pack(fill='x', pady=5)
tk.Label(format_frame, text="输出格式:", bg="#f0f0f0").pack(side=tk.LEFT, padx=5)
format_combobox = ttk.Combobox(format_frame, textvariable=self.output_format,
values=["JPG", "JPEG", "PNG", "BMP", "GIF"], width=10)
format_combobox.current(0) # 设置默认选中项为第一个选项,即"JPG"
format_combobox.pack(side=tk.LEFT, padx=5)
# 输出位置选择
output_frame = tk.Frame(main_frame, bg="#f0f0f0")
output_frame.pack(fill='x', pady=5)
tk.Label(output_frame, text="输出位置:", bg="#f0f0f0").pack(side=tk.LEFT, padx=5)
self.output_location_var = tk.StringVar()
tk.Entry(output_frame, textvariable=self.output_location_var, width=50).pack(side=tk.LEFT, padx=5)
tk.Button(output_frame, text="选择...", command=self.select_output_location).pack(side=tk.LEFT, padx=5)
# 创建一个容器用于放置压缩并保存按钮和进度条
bottom_frame = tk.Frame(self.root, bg="#f0f0f0")
bottom_frame.pack(side=tk.BOTTOM, fill='x', pady=20)
# 压缩并保存按钮
compress_button = tk.Button(bottom_frame, text="压缩并保存", command=self.start_compress_and_save)
compress_button.pack(side=tk.LEFT, padx=10)
# 进度条放在最下方
self.progress = ttk.Progressbar(bottom_frame, orient="horizontal", length=700, mode="determinate")
self.progress.pack(side=tk.RIGHT, padx=10)
def load_image(self, path):
"""加载并显示图片预览"""
try:
self.image_path = path
img = Image.open(path)
img.thumbnail((300, 300))
self.photo = ImageTk.PhotoImage(img)
self.img_label.config(image=self.photo)
except Exception as e:
logging.error(f"加载图片时出错: {str(e)}")
self.show_message("错误", f"加载图片时出错: {str(e)}")
def browse_files(self):
"""打开文件对话框选择图片"""
filename = filedialog.askopenfilename(
title="选择图片",
filetypes=[("Image files", "*.png *.jpg *.jpeg *.bmp *.gif")]
)
if filename:
self.load_image(filename)
def select_output_location(self):
"""选择图片压缩后的输出位置"""
directory = filedialog.askdirectory(title="选择输出位置")
if directory:
self.output_location_var.set(directory)
def start_compress_and_save(self):
"""启动压缩线程并在UI上显示进度条"""
self.progress["value"] = 0 # 初始化进度条为0%
self.progress["maximum"] = 100 # 设置进度条的最大值为100%
compress_thread = threading.Thread(target=self.compress_and_save)
compress_thread.start()
def compress_and_save(self):
"""执行图片压缩并保存到指定位置"""
try:
if not self.image_path or not self.output_location_var.get():
self.show_message("警告", "请选择图片和输出位置!")
return
new_filename = sanitize_filename(self.new_filename.get().strip())
if not new_filename:
self.show_message("警告", "请输入有效的文件名!")
return
output_filename = f"{new_filename}.{self.get_output_extension()}"
output_path = os.path.join(self.output_location_var.get(), output_filename)
# 检查输出路径有效性
if not os.path.isdir(self.output_location_var.get()):
logging.error(f"输出位置不存在: {self.output_location_var.get()}")
self.show_message("错误", "选择的输出位置无效,请重新选择。")
return
# 检查是否有写权限
if not os.access(self.output_location_var.get(), os.W_OK):
logging.error(f"没有写入权限: {self.output_location_var.get()}")
self.show_message("错误", "没有足够的权限在选择的位置写入文件。")
return
target_size_kb = self.target_size_kb.get()
original_size_kb = os.path.getsize(self.image_path) / 1024
if original_size_kb target_size_kb and quality >= 10:
try:
img.save(output_path, format=format_name, optimize=True, quality=quality)
original_size_kb = os.path.getsize(output_path) / 1024
quality -= 5
self.update_progress(quality)
except IOError as e:
logging.error(f"IO 错误: {str(e)}")
raise ValueError(f"IO 错误: {str(e)}")
except Exception as e:
logging.error(f"保存图片时出错: {str(e)}")
raise ValueError(f"保存图片时出错: {str(e)}")
if original_size_kb > target_size_kb:
raise ValueError("无法将图片压缩到指定大小!请尝试增加目标大小或减少图片复杂度。")
except UnidentifiedImageError:
logging.error("无法识别的图片格式")
self.show_message("错误", "无法识别的图片格式,请选择其他图片。")
except Exception as e:
logging.error(f"压缩图片时出错: {str(e)}")
self.show_message("错误", f"压缩图片时出错: {str(e)}")
def get_output_extension(self):
"""根据输出格式返回正确的文件扩展名"""
format_name = self.output_format.get().upper()
if format_name in ["JPG", "JPEG"]:
return "jpg"
elif format_name == "PNG":
return "png"
elif format_name == "BMP":
return "bmp"
elif format_name == "GIF":
return "gif"
else:
return "jpg"
def get_output_format(self):
"""根据输出格式返回正确的Pillow格式名称"""
format_name = self.output_format.get().upper()
if format_name in ["JPG", "JPEG"]:
return "JPEG"
elif format_name == "PNG":
return "PNG"
elif format_name == "BMP":
return "BMP"
elif format_name == "GIF":
return "GIF"
else:
return "JPEG"
def update_progress(self, quality):
"""更新进度条的值"""
max_quality = 95
min_quality = 10
progress_value = ((max_quality - quality) / (max_quality - min_quality)) * 100
self.root.after(0, lambda: self.set_progress_value(min(progress_value, 100)))
def set_progress_value(self, value):
"""设置进度条的值"""
self.progress["value"] = value
def show_message(self, title, message):
"""显示消息框并停止进度条"""
self.root.after(0, lambda: messagebox.showinfo(title, message))
def sanitize_filename(filename):
"""清理文件名中的非法字符"""
return re.sub(r'[\\/*?:"|]', "", filename)
if __name__ == "__main__":
root = tk.Tk()
app = ImageCompressorApp(root)
root.mainloop()
这款基于 Python 开发的局域网传输工具,在 win10、win11 系统测试可流畅运行(win7 暂未测试)。软件大小仅 16.9M,无需繁琐安装,解压后即可直接使用,为局域网内多设备文件传输带来极大便利。 功能更新亮点 新增网卡选择功能,轻松适配多网卡主机,网络环境再复杂也能稳定传输。 修复文件列表仅显示 10 个文件的问题,同时新增文件夹展开收缩功能,文件管理更直观。 加入服务控制开关,支持最小化到任务栏后台运行,不占用桌面空间,使用更灵活。 新增文件夹上传功能,满足批量文件传输需求。 增加自定义目录设置,且会自动保存到 config.ison,个性化使用更省心。 支持批量上传,大幅提升文件传输效率。 新增二维码显示,方便手机扫码连接,扫码成功后二维码窗口自动关闭,操作更简洁。 优化布局设计,界面更美观易用。 新增下载功能,将需要分享的文件复制到 upload 文件夹中,局域网内其他主机可通过访问网页进行下载。需注意:因非 ssl 安全连接,chrome 浏览器的下载器可能会阻止下载,只需在下载记录中选择允许下载即可。 使用方法 运行软件; 文件传出电脑输入 IP 地址 + 5000 端口号; 选择文件,点击上传即可。 该工具还具备上传进度显示功能,即使传输较大文件,也能清晰掌握传输状态。而且文件大小无限制,支持压缩包等各类文件格式,可实现手机与电脑互传、局域网内电脑互传、车机与电脑互传等多种场景下的文件传输,是局域网内多设备文件交互的得力助手。
软件原理及说明:1.点击软件界面左侧的《取参照物》按钮,点击以后通过鼠标截图选取一个参照物。2.点击软件界面右侧的《选取位置》按钮选取一个”参照物“可能出现的”目标区域“3.以上两步完成以后,点击《开始检测》,之后当“参照物”出现在”目标区域“以后会被软件识别,然后执行用户自定义的操作。比如点击某个指定位置或者按下键盘某个按键 注意细节:1.参照物和目标区域相对的选取较小的范围,越小识别速度越快,但也别过于太小导致识别不准确。2.选取参照物和目标区域时,区域的大小应该超过参照物的大小,毕竟参照物需要出现在目标区域中。3.如果下方的操作是移动鼠标或者单击指定区域,且你选择了《无限触发》,那么只要参照物一直出现在目标区域中,那么就会一直触发,可能导致你无法移动鼠标无法执行任何操作,此时可以按下F12按键进行中断。 其他:1.如果需要实现多种图片或造型的自动识别,或者进行比较复杂的操作,建议可以同时打开多个软件进行协作识别处理。2.本软件采用C#语言基于NET8.0进行编写,运行本软件需要在电脑安装NET8.0运行环境,如果你的windows是激活的情况下,通常会自动更新此运行环境。3.软件如果出现一些bug,关掉重新打开即可,我没有做太多的bug测试。4.不要将本软件用于互联网游戏作弊,由此产生的封号或者其他后果自行承担。 正常人的反应速度大约200-400毫秒。这个软件可以做到100毫秒以内。ps:好无聊的用途。。
因时间过长,部分代码失效,暂时取消酷狗、QQ下载,因虾米关停,取消虾米下载,目前仅支持网易,后续更新会逐步恢复。 使用方法:1、登陆音乐网站,将喜欢的歌曲网页地址的ID部分复制到本软件 如:https://music.163.com/#/song?id=3748162、将374816部分复制到本软件后,点击对应按钮下网鱼! 更新日志:V1.6.2 更新说明 1、修复部分歌曲因歌名含特殊字符问题,导致解析错误无法下载的缺陷。 2、增加程序标题显示CPU序列号,为后续无损做铺垫,防止滥用。 3、增加主界面中提示框内更新说明。 V1.6.1 更新说明 1、修复部分歌曲因有多位歌手共同演唱,导致解析错误无法下载的缺陷。 V1.6.0 更新说明 1、完美支持会员、极高音质歌曲下载,成功率达99%。 2、完善过程提示,优化逻辑。 3、后续将增加无损,甚至母带音质。 V1.5.0 更新说明 1、初步支持会员、极高音质歌曲下载,但成功率不高,后续待完善。 2、因使用到json解析,将dll合并到exe中,导致文件有所增大。 V1.4.1 更新说明 1、修改程序标题,完善文字提示。 2、重新编译。 V1.4.0 更新说明——增加 1、增加音乐下载后,文件明为“歌名 - 歌手”。 2、优化程序,减少体积,不再需要单独dll。
(十周年纪念版)- 更新了apktool(2.10.0_20240226)、smali(3.0.5_20240226)、jadx(1.4.7)、Python(3.8.10)、OpenJDK(21.0.2,32位版本为8u392)、adb、apksigner、zipalign。- 增加了对apktool 2.9.0及以上版本的支持:选择AAPT版本和资源处理模式(移除、占位符、保留)。- BuildApkTool插件1.2:从源代码下载并编译最新版本的ApkTool和smali。- 更新了UnpackerFirmware插件至2.0.0版本。- 更新了ColorPicker插件1.1:增加了透明度调节功能。- 增加了快速选择菜单子项的功能,即可以输入71代替7 -> 1(支持快速选择的项目在本版本中已用颜色标出)。- 在高级设置中添加了强制添加v1签名和生成v4签名文件(.idsig)的选项。- 在高级设置中添加了完全关闭专家模式的选项。- 各种修复。 复制要修改的APK到input目录里面
0.0.9 更新新增:文件小工具-合并隐藏:选择图片和压缩包后,将压缩包合并至图片中,展示格式为图片;复原方式:修改结果图片后缀为原压缩包格式修复旧版中一些导致原有功能异常的bug ------------------------------------------------- 分割线 ------------------------------------------------- 0.0.8 更新新增文件拖拽:由于技术问题,文件拖拽无法获取到绝对路径,所以存在一次临时文件复制(用完即删),相比直接选择会慢点;样式调整:导航栏折叠/页面按钮调整;批量重命名:新增“在第x个字符后插入” ------------------------------------------------- 分割线 ------------------------------------------------- 0.0.6 更新关于图片修复: 优化了一下图片修复的模型选择:这几个模型适用不同的放大倍数,所以对相应的倍数选择做了限制;如果是一般的人像、风景场景的,就选默认那个模型(其他几个其实也可以);动漫类型的可以选标注了anime的模型;有朋友问到GPU的问题:在视频放大时,编码方式选择“硬件加速”会用上GPU,图片暂无。链接没变 ------------------------------------------------- 分割线 ------------------------------------------------- 0.0.5 更新音视频工具视频-格式|倍速 (新增:批量调整视频倍速)链接没变 ------------------------------------------------- 分割线 ------------------------------------------------- 0.0.4 更新文件管理小工具 批量重命名 - 编号 (新增,编号递增重命名文件)文件名提取 (新增,提取文件夹下所有文件名至txt中) ------------------------------------------------- 分割线 ------------------------------------------------- 0.0.3 自己开发的windows工具软件,主要包括以下几项功能: 批量图片高清修复视频高清修复文件管理小工具文件提级批量重命名音视频工具音频提取视频格式转换ffmpeg命令行模式图片和视频高清修复用的是开源模型Real-ESRGAN-ncnn-vulkan, 视频的修复功能有限,比较吃配置,可以试试十几秒的视频(再大的不建议)’。 文件管理工具和音视频工具是一些常用的小功能,如果有朋友有其他类似的、可作为单独tab功能开发的需求,可以提出来,后续会考虑加入。 ffmpeg命令行模式,是用通义千问辅助实现的,如果你有ak,可以配置使用;或者自己输入命令行也能执行。 软件配了暗黑模式,可调节软件白皮or黑皮。 建议不要安装在C盘,配置通义千问的ak时,写配置可能会出现权限问题。
一、核心功能与特性 碎片整理能力 精准定位与整理:可针对单个文件、指定目录或系统注册表项进行碎片整理,无需全盘扫描,节省时间与资源。 多种整理模式:支持 “快速整理”(仅处理严重碎片)、“智能整理”(自动优化文件分布)、“完整整理”(深度重组文件结构),适配不同场景需求。 多文件系统兼容:支持 FAT、FAT32、NTFS 等主流文件系统,适用于各类 Windows 系统(如 Windows 7/10/11)。 便携与轻量化设计 免安装绿色版:无需写入系统注册表,解压后直接运行,可存储于 U 盘等移动设备,方便携带与分发。 独立运行:不依赖额外动态链接库(DLL),避免因环境差异导致的兼容性问题。 灵活操作方式 命令行批量处理:支持大量可选命令行开关(如/quick快速整理、/folder "目标路径"指定目录),适合系统管理员或脚本自动化场景。 二、对比传统磁盘整理工具 维度 WinContig Windows 自带磁盘整理工具 整理粒度 支持单个文件 / 目录精准整理 仅支持全盘或分区整体整理 便携性 绿色免安装,可随时运行 需系统内置,无法独立携带 操作灵活性 命令行与图形界面双支持,参数可自定义 图形界面操作固定,参数调整有限 整理效率 针对目标碎片优先处理,速度更快 全盘扫描耗时较长,效率较低 三、使用场景与优势 日常文件优化:当某类文件(如大型视频、游戏安装包)频繁读写导致碎片时,直接定位整理,提升访问速度。 系统性能维护:对系统目录(如C:\Windows)或注册表项进行整理,减少因碎片导致的程序卡顿或启动变慢。 服务器 / 工作站管理:通过命令行批量整理多台设备的指定文件,适配企业级运维需求。 老旧设备提速:对机械硬盘(HDD)的碎片整理效果显著,可缓解因碎片积累导致的运行迟缓问题。 四、绿色版特殊优化 语言精简:删除非必要语言包,仅保留中文与英文界面,减少程序体积(通常压缩后仅数 MB),提升启动速度。 资源轻量:运行时内存占用低,可在低配设备或后台静默执行,不影响前台操作。 五、使用注意事项 固态硬盘(SSD)谨慎使用:SSD 依赖 TRIM 指令管理存储,频繁碎片整理可能缩短寿命,建议仅对明确产生碎片的文件(如超大数据库)按需操作。 整理前备份:尽管 WinContig 基于微软官方 API 开发,安全性较高,但仍建议对重要文件提前备份,避免极端情况下的数据风险。 关闭文件占用:整理目标文件时,确保其未被其他程序占用(如正在编辑的文档、运行中的程序),否则可能导致整理失败。
功能特点运行稳定:基于playwright支持网页登录夸克网盘,无需手动获取Cookie。轻松操作:简洁直观的命令行界面,方便快捷地完成文件转存。批量转存:支持一次性转存多个夸克网盘分享链接中的文件。批量分享:支持一次性将某个文件夹内的所有文件夹批量生成分享链接,无需手动分享文件。本地下载:支持批量下载网盘文件夹中的所有文件。 需要有夸克账号 打开后需要登录下你的夸克账号 如果是大文件 需要你网盘空间足够! 解压密码:www.cn121.com
这是一款第三方蓝奏云客户端,支持突破蓝奏云的文件上传限制,支持用户将超过100MB的文件进行分割上传。 通过分割文件的方式,允许用户在不受文件大小限制的情况下,轻松上传和分享大文件。