1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
def calculate_quantization_table(quality):
"""
计算 JPEG 量化表
基于 IJG (Independent JPEG Group) 算法
"""
# IJG 标准量化表(quality=50)
Q50 = [
[16, 11, 10, 16, 24, 40, 51, 61],
[12, 12, 14, 19, 26, 58, 60, 55],
[14, 13, 16, 24, 40, 57, 69, 56],
[14, 17, 22, 29, 51, 87, 80, 62],
[18, 22, 37, 56, 68, 109, 103, 77],
[24, 35, 55, 64, 81, 104, 113, 92],
[49, 64, 78, 87, 103, 121, 120, 101],
[72, 92, 95, 98, 112, 100, 103, 99]
]
# Quality 转换为缩放因子
if quality < 50:
scale = 5000 / quality
else:
scale = 200 - quality * 2
# 缩放量化表
Q_table = []
for row in Q50:
scaled_row = []
for val in row:
scaled_val = (val * scale + 50) // 100
scaled_val = max(1, min(255, scaled_val)) # 限制范围
scaled_row.append(scaled_val)
Q_table.append(scaled_row)
return Q_table
# 示例输出
print("Quality=10:")
print(calculate_quantization_table(10))
# [[80, 55, 50, 80, 120, 200, 255, 255], ...] ← 激进量化
print("\nQuality=75:")
print(calculate_quantization_table(75))
# [[ 8, 6, 5, 8, 12, 20, 26, 31], ...] ← 平衡量化
print("\nQuality=95:")
print(calculate_quantization_table(95))
# [[ 2, 1, 1, 2, 2, 4, 5, 6], ...] ← 保守量化
|