ai-chatbot/图片压缩优化方案说明.md
Your Name fea5e0fac5
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
优化图片压缩技术:避免双重压缩,保持JPG/PNG格式
- 客户端压缩:保持原格式(JPG保持JPG,PNG保持PNG),不再强制转换为WebP
- 提高压缩质量:最低质量从0.6提高到0.90,避免画质损失
- 启用高质量图像平滑:减少锯齿,提升画质
- 服务器端智能优化:使用MozJPEG和PNG优化算法
- 避免双重压缩:小文件(<3MB)跳过服务器端优化,只有优化效果明显(>5%)才使用
- 优化策略:优先缩小尺寸而不是降低质量,留余量给服务器端优化

技术改进:
- JPEG: MozJPEG编码器,质量92%,渐进式,优化扫描
- PNG: 压缩级别6,自适应过滤,调色板优化
- 智能判断:避免不必要的双重压缩,保护画质
2026-01-02 20:46:01 +08:00

3.9 KiB
Raw Blame History

图片压缩优化方案说明

问题分析

双重压缩问题

  • 客户端压缩:使用Canvas API,质量0.88-0.92
  • 服务器端优化:使用Sharp MozJPEG,质量92%
  • 风险:如果客户端已经压缩,服务器端再压缩,可能造成双重压缩,导致画质损失

优化方案

策略:避免双重压缩,智能优化

1. 客户端压缩策略(components/multimodal-input.tsx)

优化点:

  • ✅ 优先缩小尺寸:如果图片太大,先缩小尺寸而不是降低质量
  • ✅ 提高质量下限:最低质量从0.6提高到0.90,避免画质损失
  • ✅ 留余量给服务器:目标大小设为maxSizeMB * 0.9,留10%余量给服务器端优化
  • ✅ 尺寸调整后使用高质量:如果已缩小尺寸,使用0.95质量,让服务器端做最终优化

逻辑:

如果图片 > 5MB 或 > 4K分辨率
  ↓
优先缩小尺寸(保持高质量)
  ↓
如果还是太大,才降低质量(最低0.90)
  ↓
输出文件(留余量给服务器端优化)

2. 服务器端优化策略(app/(chat)/api/files/upload/route.ts)

优化点:

  • ✅ 智能判断:如果文件 < 3MB,跳过优化(避免双重压缩)
  • ✅ 效果检查:只有优化后文件减少 > 5% 才使用,否则返回原图
  • ✅ 使用更好的编码器:MozJPEG(更好的算法,而不是降低质量)

逻辑:

接收文件
  ↓
检查文件大小
  ├─ < 3MB → 跳过优化(客户端已处理)
  └─ ≥ 3MB → 使用MozJPEG/PNG优化
      ↓
  检查优化效果
      ├─ 减少 > 5% → 使用优化结果
      └─ 减少 ≤ 5% → 使用原图

工作流程

场景1:小文件(< 5MB,< 4K)

客户端:直接返回原图(免检通道)
服务器:< 3MB,跳过优化
结果:原图直接存储,无压缩

场景2:中等文件(5-8MB,< 4K)

客户端:可能轻微压缩(质量0.90-0.95)
服务器:< 3MB,跳过优化
结果:客户端压缩后存储,无双重压缩

场景3:大文件(> 8MB 或 > 4K)

客户端:缩小尺寸 + 高质量压缩(质量0.90-0.95)
  ↓
服务器:≥ 3MB,使用MozJPEG优化
  ↓
检查优化效果
  ├─ 减少 > 5% → 使用优化结果
  └─ 减少 ≤ 5% → 使用原图(避免双重压缩)

优化效果

避免双重压缩

  • ✅ 小文件(< 3MB):服务器端跳过优化
  • ✅ 优化效果检查:只有明显优化才使用
  • ✅ 客户端提高质量下限:0.6 → 0.90

画质保护

  • ✅ 客户端优先缩小尺寸,而不是降低质量
  • ✅ 服务器端使用更好的编码器(MozJPEG),而不是降低质量
  • ✅ 智能判断,避免不必要的处理

文件大小

  • ✅ 客户端留10%余量给服务器端优化
  • ✅ 服务器端使用MozJPEG(压缩率高15-25%)
  • ✅ 双重优化效果更好(但避免双重压缩)

技术细节

客户端压缩参数

  • 起始质量:0.92(尺寸未调整)或 0.95(尺寸已调整)
  • 最低质量:0.90(避免画质损失)
  • 目标大小:maxSizeMB * 0.9(留余量)
  • 图像平滑:high(减少锯齿)

服务器端优化参数

  • 优化阈值:3MB(小于此值跳过优化)
  • 效果阈值:5%(只有减少超过5%才使用)
  • JPEG质量:92%(高质量)
  • PNG质量:100%(无损)

预期效果

文件大小 客户端处理 服务器端处理 最终结果
< 3MB 原图或轻微压缩 跳过优化 高质量,无双重压缩
3-8MB 高质量压缩 智能优化 高质量,单次优化
> 8MB 缩小尺寸+高质量 MozJPEG优化 高质量,双重优化(但避免双重压缩)

总结:通过智能判断和效果检查,避免不必要的双重压缩,同时保证画质和文件大小优化。