根据新版本调整set_pattern:0~65535

This commit is contained in:
xinzhu.yin
2026-07-07 18:59:44 +08:00
parent 9fa811a9eb
commit 32aaef1c0f
24 changed files with 3016 additions and 279 deletions

View File

@@ -1,15 +1,17 @@
# -*- coding: UTF-8 -*-
"""
数据范围转换器
将 Full Range (0-255) 转换为 Limited Range (16-235)
使用方法:
from app.data_range_converter import DataRangeConverter
converter = DataRangeConverter()
converted_params = converter.convert(pattern_params, "Limited")
将 Full Range (065535) 转换为 Limited RangeSolidColor 刻度)
"""
from app.solid_color_scale import (
LIMITED_SOLID_COLOR_BLACK,
LIMITED_SOLID_COLOR_WHITE,
SOLID_COLOR_MAX,
SOLID_COLOR_MIN,
clamp_solid_color,
)
class DataRangeConverter:
"""数据范围转换器"""
@@ -25,38 +27,22 @@ class DataRangeConverter:
def convert_value(self, value):
"""
将单个 Full Range 值转换为 Limited Range
将单个 Full Range 值转换为 Limited RangeSolidColor 刻度)。
转换公式:
limited = 16 + (value / 255) × (235 - 16)
Args:
value: Full Range 值 (0-255)
Returns:
int: Limited Range 值 (16-235)
转换公式(归一化后线性映射):
limited = L_black + (value / MAX) × (L_white - L_black)
"""
# 边界值直接映射
if value == 0:
return 16
elif value == 255:
return 235
else:
# 线性映射
limited = 16 + round((value / 255.0) * (235 - 16))
# 限制范围
return max(16, min(235, limited))
value = clamp_solid_color(value)
if value <= SOLID_COLOR_MIN:
return LIMITED_SOLID_COLOR_BLACK
if value >= SOLID_COLOR_MAX:
return LIMITED_SOLID_COLOR_WHITE
span = LIMITED_SOLID_COLOR_WHITE - LIMITED_SOLID_COLOR_BLACK
limited = LIMITED_SOLID_COLOR_BLACK + round((value / SOLID_COLOR_MAX) * span)
return max(LIMITED_SOLID_COLOR_BLACK, min(LIMITED_SOLID_COLOR_WHITE, limited))
def convert_rgb(self, r, g, b):
"""
转换单个 RGB 值
Args:
r, g, b: Full Range RGB 值 (0-255)
Returns:
tuple: Limited Range RGB 值 (16-235)
"""
"""转换单个 RGB 值SolidColor Full → Limited"""
return (self.convert_value(r), self.convert_value(g), self.convert_value(b))
def convert(self, pattern_params, data_range="Full"):
@@ -73,7 +59,7 @@ class DataRangeConverter:
# Full Range 不需要转换
if data_range == "Full":
if self.verbose:
print("使用 Full Range (0-255),无需转换")
print(f"使用 Full Range (0{SOLID_COLOR_MAX}),无需转换")
return pattern_params
# Limited Range 需要转换
@@ -112,8 +98,11 @@ class DataRangeConverter:
def _print_header(self):
"""打印转换头部信息"""
print("=" * 80)
print("【数据范围转换】Limited Range (16-235)")
print(" 转换公式: 16 + (value / 255) × (235 - 16)")
print("【数据范围转换】Limited Range (SolidColor 刻度)")
print(
f" 映射: {SOLID_COLOR_MIN}{SOLID_COLOR_MAX}"
f"{LIMITED_SOLID_COLOR_BLACK}{LIMITED_SOLID_COLOR_WHITE}"
)
print("=" * 80)
def _print_conversion(self, index, r_orig, g_orig, b_orig, r_new, g_new, b_new):
@@ -126,25 +115,23 @@ class DataRangeConverter:
"""
# 判断是否需要打印
should_print = False
label = ""
mid = SOLID_COLOR_MAX // 2
# 第一个和最后一个
if index == 0:
should_print = True
label = "黑色"
elif index == len([]) - 1: # 需要在外部判断
should_print = True
label = "白色"
# 关键 RGB 值
elif (
r_orig in [0, 128, 255]
or g_orig in [0, 128, 255]
or b_orig in [0, 128, 255]
r_orig in [SOLID_COLOR_MIN, mid, SOLID_COLOR_MAX]
or g_orig in [SOLID_COLOR_MIN, mid, SOLID_COLOR_MAX]
or b_orig in [SOLID_COLOR_MIN, mid, SOLID_COLOR_MAX]
):
should_print = True
if r_orig == 128:
if r_orig == mid:
label = "50%"
else:
label = ""
if should_print:
diff = abs(r_new - r_orig)
@@ -165,9 +152,9 @@ class DataRangeConverter:
return {
"name": "Data Range Converter",
"version": "1.0.0",
"full_range": "0-255",
"limited_range": "16-235",
"formula": "16 + (value / 255) × 219",
"full_range": f"0-{SOLID_COLOR_MAX}",
"limited_range": f"{LIMITED_SOLID_COLOR_BLACK}-{LIMITED_SOLID_COLOR_WHITE}",
"formula": "L_black + (value / MAX) × (L_white - L_black)",
}
@@ -188,9 +175,9 @@ def convert_pattern_params(pattern_params, data_range="Full", verbose=True):
示例:
>>> from app.data_range_converter import convert_pattern_params
>>> params = [[0,0,0], [255,255,255]]
>>> params = [[0,0,0], [65535,65535,65535]]
>>> converted = convert_pattern_params(params, "Limited")
[[16,16,16], [235,235,235]]
[[4112,4112,4112], [60492,60492,60492]]
"""
converter = DataRangeConverter(verbose=verbose)
return converter.convert(pattern_params, data_range)
@@ -201,7 +188,7 @@ def convert_single_rgb(r, g, b, data_range="Full"):
便捷函数:转换单个 RGB 值
Args:
r, g, b: RGB 值 (0-255)
r, g, b: RGB 值 (065535)
data_range: "Full""Limited"
Returns:
@@ -232,7 +219,8 @@ if __name__ == "__main__":
print("\n[测试 1] 基本转换...")
converter = DataRangeConverter(verbose=False)
test_values = [0, 16, 64, 128, 192, 235, 255]
test_values = [0, LIMITED_SOLID_COLOR_BLACK, SOLID_COLOR_MAX // 4, SOLID_COLOR_MAX // 2,
SOLID_COLOR_MAX * 3 // 4, LIMITED_SOLID_COLOR_WHITE, SOLID_COLOR_MAX]
print(" Full Range → Limited Range:")
for v in test_values:
limited = converter.convert_value(v)
@@ -243,8 +231,8 @@ if __name__ == "__main__":
print("\n[测试 2] RGB 转换...")
test_rgb = [
(0, 0, 0),
(128, 128, 128),
(255, 255, 255),
(SOLID_COLOR_MAX // 2, SOLID_COLOR_MAX // 2, SOLID_COLOR_MAX // 2),
(SOLID_COLOR_MAX, SOLID_COLOR_MAX, SOLID_COLOR_MAX),
]
for r, g, b in test_rgb:
@@ -253,12 +241,14 @@ if __name__ == "__main__":
# 测试 3: 完整转换流程
print("\n[测试 3] 完整转换流程...")
from app.ucd.solid_color_scale import byte_to_solid_color as _sc
pattern_params = [
[255, 255, 255], # 100% 白
[230, 230, 230], # 90%
[204, 204, 204], # 80%
[128, 128, 128], # 50%
[0, 0, 0], # 0% 黑
[_sc(255)] * 3,
[_sc(230)] * 3,
[_sc(204)] * 3,
[_sc(128)] * 3,
[0, 0, 0],
]
converted = converter.convert(pattern_params, "Limited")
@@ -270,11 +260,11 @@ if __name__ == "__main__":
# 测试 4: 便捷函数
print("\n[测试 4] 便捷函数...")
result = convert_pattern_params(
[[0, 0, 0], [255, 255, 255]], "Limited", verbose=False
[[0, 0, 0], [SOLID_COLOR_MAX, SOLID_COLOR_MAX, SOLID_COLOR_MAX]], "Limited", verbose=False
)
print(f" 结果: {result}")
r, g, b = convert_single_rgb(128, 128, 128, "Limited")
r, g, b = convert_single_rgb(SOLID_COLOR_MAX // 2, SOLID_COLOR_MAX // 2, SOLID_COLOR_MAX // 2, "Limited")
print(f" RGB(128,128,128) → RGB({r},{g},{b})")
# 测试 5: 获取信息