68 lines
1.7 KiB
Python
Executable File
68 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
|
||
import sys
|
||
|
||
# 取自 xterm 256 色表
|
||
def xterm_colors():
|
||
colors = []
|
||
|
||
# 0-15: 系統顏色(略過)
|
||
for i in range(16):
|
||
colors.append((0, 0, 0)) # dummy
|
||
|
||
# 16–231: 6x6x6 color cube
|
||
levels = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
|
||
for r in levels:
|
||
for g in levels:
|
||
for b in levels:
|
||
colors.append((r, g, b))
|
||
|
||
# 232–255: grayscale ramp
|
||
for gray in range(8, 248, 10):
|
||
colors.append((gray, gray, gray))
|
||
|
||
return colors
|
||
|
||
def hex_to_rgb(hexcode):
|
||
hexcode = hexcode.lstrip('#')
|
||
if len(hexcode) != 6:
|
||
raise ValueError("請輸入有效的 HEX 色碼,例如 #566177")
|
||
r = int(hexcode[0:2], 16)
|
||
g = int(hexcode[2:4], 16)
|
||
b = int(hexcode[4:6], 16)
|
||
return (r, g, b)
|
||
|
||
def color_distance(c1, c2):
|
||
return sum((a - b) ** 2 for a, b in zip(c1, c2))
|
||
|
||
def find_nearest_xterm_color(hexcode):
|
||
rgb = hex_to_rgb(hexcode)
|
||
colors = xterm_colors()
|
||
|
||
best_index = 16 # 開始於 16(跳過前 16 個)
|
||
best_distance = float('inf')
|
||
|
||
for i in range(16, 256):
|
||
dist = color_distance(rgb, colors[i])
|
||
if dist < best_distance:
|
||
best_index = i
|
||
best_distance = dist
|
||
|
||
return best_index, colors[best_index]
|
||
|
||
def main():
|
||
if len(sys.argv) != 2:
|
||
print("使用方式:hex2xterm.py #RRGGBB")
|
||
return
|
||
|
||
hexcode = sys.argv[1]
|
||
try:
|
||
idx, rgb = find_nearest_xterm_color(hexcode)
|
||
print(f"最接近的 Xterm 色碼為:{idx}")
|
||
print(f"Xterm RGB:#{rgb[0]:02X}{rgb[1]:02X}{rgb[2]:02X}")
|
||
except Exception as e:
|
||
print(f"錯誤:{e}")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|