Files
python----/北川/快速压缩脚本.py
T
admin aac9f5934d feat: 添加多个功能模块和工具脚本
- 新增websocket客户端和服务端实现
- 添加图片压缩工具和快速压缩脚本
- 实现学生信息处理相关API
- 添加MQTT客户端和消息处理功能
- 更新.gitignore忽略更多文件类型
- 添加数据库操作工具和示例
- 实现多个测试脚本和工具类
2026-04-13 14:47:50 +08:00

184 lines
5.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
快速压缩脚本 - 专门解决上传照片文件太大问题
自动压缩超过3MB的JPG照片到小于3MB
"""
import os
from PIL import Image
def quick_compress_for_upload(file_path, max_size_mb=3):
"""
快速压缩图片,专门用于解决上传问题
Args:
file_path: 图片文件路径
max_size_mb: 最大文件大小(MB)
Returns:
bool: 是否成功压缩
"""
try:
# 检查文件大小
original_size = os.path.getsize(file_path)
original_size_mb = original_size / (1024 * 1024)
print(f"处理文件: {os.path.basename(file_path)}")
print(f"原始大小: {original_size_mb:.2f}MB")
# 如果文件已经小于目标大小,直接返回
if original_size_mb <= max_size_mb:
print(f"✓ 文件已小于{max_size_mb}MB,无需压缩")
return True
# 打开图片
with Image.open(file_path) as img:
# 转换为RGB模式
if img.mode != 'RGB':
img = img.convert('RGB')
width, height = img.size
# 如果图片尺寸很大,先调整尺寸
if max(width, height) > 2000:
scale = 2000 / max(width, height)
new_width = int(width * scale)
new_height = int(height * scale)
img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
print(f"调整尺寸至: {new_width}x{new_height}")
# 快速压缩算法
for quality in [85, 75, 65, 55, 45, 35, 25]:
temp_file = f"{file_path}.temp"
img.save(temp_file, format='JPEG', quality=quality, optimize=True)
compressed_size = os.path.getsize(temp_file)
compressed_size_mb = compressed_size / (1024 * 1024)
print(f"质量{quality}%: {compressed_size_mb:.2f}MB")
if compressed_size_mb <= max_size_mb:
# 成功压缩,替换原文件
os.replace(temp_file, file_path)
compression_ratio = (original_size - compressed_size) / original_size * 100
print(f"✓ 压缩成功!质量:{quality}%, 压缩率:{compression_ratio:.1f}%")
return True
else:
os.remove(temp_file)
print("✗ 无法压缩到目标大小")
return False
except Exception as e:
print(f"✗ 压缩失败: {str(e)}")
return False
def compress_student_photos():
"""
压缩学生照片目录中的所有照片
"""
students_dir = "./students/"
if not os.path.exists(students_dir):
print(f"目录不存在: {students_dir}")
return
print("开始压缩学生照片...")
print("=" * 40)
success_count = 0
failed_count = 0
skipped_count = 0
# 获取所有JPG文件
jpg_files = []
for root, dirs, files in os.walk(students_dir):
for file in files:
if file.lower().endswith(('.jpg', '.jpeg')):
jpg_files.append(os.path.join(root, file))
print(f"找到 {len(jpg_files)} 张照片")
print("-" * 40)
# 处理每张照片
for i, file_path in enumerate(jpg_files, 1):
print(f"\n[{i}/{len(jpg_files)}] {os.path.basename(file_path)}")
# 快速压缩
if quick_compress_for_upload(file_path, max_size_mb=3):
success_count += 1
else:
failed_count += 1
# 统计结果
print("\n" + "=" * 40)
print("压缩完成!")
print(f"成功: {success_count}")
print(f"失败: {failed_count}")
print(f"总计: {len(jpg_files)}")
def compress_single_photo(file_path):
"""
压缩单张照片
"""
if not os.path.exists(file_path):
print(f"文件不存在: {file_path}")
return
if not file_path.lower().endswith(('.jpg', '.jpeg')):
print(f"不是JPG格式文件: {file_path}")
return
print(f"压缩单张照片: {os.path.basename(file_path)}")
print("-" * 30)
quick_compress_for_upload(file_path, max_size_mb=3)
if __name__ == "__main__":
import sys
print("快速照片压缩工具")
print("=" * 30)
print("专门解决上传照片文件太大问题")
print()
if len(sys.argv) > 1:
# 命令行模式
file_path = sys.argv[1]
if os.path.exists(file_path):
if os.path.isfile(file_path):
compress_single_photo(file_path)
elif os.path.isdir(file_path):
# 如果是目录,切换到该目录并压缩
original_dir = os.getcwd()
os.chdir(file_path)
compress_student_photos()
os.chdir(original_dir)
else:
print(f"路径不存在: {file_path}")
else:
# 交互模式
print("选择操作:")
print("1. 压缩学生照片目录")
print("2. 压缩单张照片")
print("3. 自定义目录")
choice = input("\n请输入选择(1-3): ").strip()
if choice == "1":
compress_student_photos()
elif choice == "2":
file_path = input("请输入照片文件路径: ").strip()
compress_single_photo(file_path)
elif choice == "3":
dir_path = input("请输入目录路径: ").strip()
if os.path.exists(dir_path):
original_dir = os.getcwd()
os.chdir(dir_path)
compress_student_photos()
os.chdir(original_dir)
else:
print(f"目录不存在: {dir_path}")
else:
print("无效选择")